You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by va...@apache.org on 2008/01/22 11:31:13 UTC
svn commit: r614165 - in
/harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java:
JavaByteCodeTranslator.cpp JavaByteCodeTranslator.h
Author: varlax
Date: Tue Jan 22 02:31:10 2008
New Revision: 614165
URL: http://svn.apache.org/viewvc?rev=614165&view=rev
Log:
Applied HARMONY-5399 [drlvm][jit] Enabling arraycopy optimization for primitive types when write barriers are enabled
Modified:
harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp
harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.h
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp?rev=614165&r1=614164&r2=614165&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp Tue Jan 22 02:31:10 2008
@@ -1645,8 +1645,8 @@
//
// Try some optimizations for System::arraycopy(...), Min, Max, Abs...
//
- if (!compilationInterface.needWriteBarriers() //genArrayCopyRepMove is not ready to work in WB mode
- && translationFlags.genArrayCopyRepMove == true
+
+ if (translationFlags.genArrayCopyRepMove == true
&& genArrayCopyRepMove(methodDesc,numArgs,srcOpnds)) {
return;
} else if (translationFlags.genArrayCopy == true &&
@@ -2361,7 +2361,8 @@
bool
JavaByteCodeTranslator::arraycopyOptimizable(MethodDesc * methodDesc,
uint32 numArgs,
- Opnd ** srcOpnds) {
+ Opnd ** srcOpnds,
+ bool usingWriteBarriers) {
//
// an ArrayStoreException is thrown and the destination is not modified:
@@ -2385,32 +2386,56 @@
srcOpnds[3]->getType()->isInt4() && // 3 - dstPos
srcOpnds[4]->getType()->isInt4()); // 4 - length
- bool throwsASE = false;
bool srcIsArray = srcType->isArray() && !srcType->isUnresolvedType();
bool dstIsArray = dstType->isArray() && !dstType->isUnresolvedType();
- ArrayType* srcAsArrayType = srcType->asArrayType();
- ArrayType* dstAsArrayType = dstType->asArrayType();
- bool srcIsArrOfPrimitive = srcIsArray && VMInterface::isArrayOfPrimitiveElements(srcAsArrayType->getVMTypeHandle());
- bool dstIsArrOfPrimitive = dstIsArray && VMInterface::isArrayOfPrimitiveElements(dstAsArrayType->getVMTypeHandle());
- if ( !(srcIsArray && dstIsArray) ) {
- throwsASE = true;
- } else if ( srcIsArrOfPrimitive ) {
- if( !dstIsArrOfPrimitive || srcType != dstType )
- throwsASE = true;
- } else if( dstIsArrOfPrimitive ) {
- throwsASE = true;
- } else { // the both are of objects
- // Here is some inaccuracy. If src is a subclass of dst there is no ASE for sure.
- // If it is not, we should check the assignability of each element being copied.
- // To avoid this we just reject the inlining of System::arraycopy call in this case.
- NamedType* srcElemType = srcAsArrayType->getElementType();
- NamedType* dstElemType = dstAsArrayType->getElementType();
- throwsASE = srcElemType->getVMTypeHandle() != dstElemType->getVMTypeHandle();
+
+ bool isOptimizable = true;
+
+ if ( srcIsArray && dstIsArray ) {
+ // these are arrays
+
+ ArrayType* srcAsArrayType = srcType->asArrayType();
+ ArrayType* dstAsArrayType = dstType->asArrayType();
+ bool srcIsArrOfPrimitive = srcIsArray && VMInterface::isArrayOfPrimitiveElements(srcAsArrayType->getVMTypeHandle());
+ bool dstIsArrOfPrimitive = dstIsArray && VMInterface::isArrayOfPrimitiveElements(dstAsArrayType->getVMTypeHandle());
+
+ // are these primitive or reference arrays?
+ if ( srcIsArrOfPrimitive && dstIsArrOfPrimitive ) {
+ // both arrays are primitive
+
+ // if we are dealing with different primitive type arrays, reject optimization
+ // TODO: is that really necessary?
+ isOptimizable = (srcType == dstType);
+
+ } else if ( srcIsArrOfPrimitive ^ dstIsArrOfPrimitive ) {
+ // arrays are mixed primitive and reference types
+ // reject optimization
+ isOptimizable = false;
+
+ } else {
+ // both arrays are reference
+
+ // if write barriers are enabled, reject optimization
+ // if not, check the types
+ if ( usingWriteBarriers && compilationInterface.needWriteBarriers() ) {
+ isOptimizable = false;
+ } else {
+ // Here is some inaccuracy. If src is a subclass of dst there is no ASE for sure.
+ // If it is not, we should check the assignability of each element being copied.
+ // To avoid this we just reject the inlining of System::arraycopy call in this case.
+ NamedType* srcElemType = srcAsArrayType->getElementType();
+ NamedType* dstElemType = dstAsArrayType->getElementType();
+ isOptimizable = (srcElemType->getVMTypeHandle() == dstElemType->getVMTypeHandle());
+ }
+
+ }
+
+ } else {
+ // source or destination are not arrays
+ isOptimizable = false;
}
- if ( throwsASE )
- return false;
- else
- return true;
+
+ return isOptimizable;
}
bool
@@ -2419,7 +2444,7 @@
Opnd ** srcOpnds) {
if( !methodIsArraycopy(methodDesc) ||
- !arraycopyOptimizable(methodDesc,numArgs,srcOpnds) )
+ !arraycopyOptimizable(methodDesc,numArgs,srcOpnds,true) )
{
// reject the inlining of System::arraycopy call
return false;
@@ -2573,7 +2598,7 @@
Opnd ** srcOpnds) {
if( !methodIsArraycopy(methodDesc) ||
- !arraycopyOptimizable(methodDesc,numArgs,srcOpnds) )
+ !arraycopyOptimizable(methodDesc,numArgs,srcOpnds,false) )
{
// reject the inlining of System::arraycopy call
return false;
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.h?rev=614165&r1=614164&r2=614165&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.h Tue Jan 22 02:31:10 2008
@@ -274,7 +274,7 @@
bool genVMHelper(const char* mname, uint32 numArgs,Opnd ** srcOpnds,Type * returnType);
bool methodIsArraycopy(MethodDesc * methodDesc);
- bool arraycopyOptimizable(MethodDesc * methodDesc, uint32 numArgs, Opnd ** srcOpnds);
+ bool arraycopyOptimizable(MethodDesc * methodDesc, uint32 numArgs, Opnd ** srcOpnds, bool usingWriteBarriers);
bool genCharArrayCopy(MethodDesc * methodDesc,uint32 numArgs,Opnd ** srcOpnds, Type * returnType);
bool genArrayCopyRepMove(MethodDesc * methodDesc,uint32 numArgs,Opnd ** srcOpnds);