diff options
Diffstat (limited to 'vm/compiler/Loop.c')
-rw-r--r-- | vm/compiler/Loop.c | 90 |
1 files changed, 59 insertions, 31 deletions
diff --git a/vm/compiler/Loop.c b/vm/compiler/Loop.c index 031464c3c..9ee430d42 100644 --- a/vm/compiler/Loop.c +++ b/vm/compiler/Loop.c @@ -38,18 +38,24 @@ */ static void handlePhiPlacement(CompilationUnit *cUnit) { - BasicBlock *entry = cUnit->blockList[0]; - BasicBlock *loopBody = cUnit->blockList[1]; - BasicBlock *loopBranch = cUnit->blockList[2]; + BasicBlock *entry = + (BasicBlock *) dvmGrowableListGetElement(&cUnit->blockList, 0); + BasicBlock *loopBody = + (BasicBlock *) dvmGrowableListGetElement(&cUnit->blockList, 1); + BasicBlock *loopBranch = + (BasicBlock *) dvmGrowableListGetElement(&cUnit->blockList, 2); dvmCopyBitVector(entry->dataFlowInfo->defV, loopBody->dataFlowInfo->liveInV); BitVector *phiV = dvmCompilerAllocBitVector(cUnit->method->registersSize, false); + BitVector *phi2V = dvmCompilerAllocBitVector(cUnit->method->registersSize, + false); dvmIntersectBitVectors(phiV, entry->dataFlowInfo->defV, loopBody->dataFlowInfo->defV); - dvmIntersectBitVectors(phiV, entry->dataFlowInfo->defV, + dvmIntersectBitVectors(phi2V, entry->dataFlowInfo->defV, loopBranch->dataFlowInfo->defV); + dvmUnifyBitVectors(phiV, phiV, phi2V); /* Insert the PHI MIRs */ int i; @@ -57,7 +63,7 @@ static void handlePhiPlacement(CompilationUnit *cUnit) if (!dvmIsBitSet(phiV, i)) { continue; } - MIR *phi = dvmCompilerNew(sizeof(MIR), true); + MIR *phi = (MIR *)dvmCompilerNew(sizeof(MIR), true); phi->dalvikInsn.opcode = kMirOpPhi; phi->dalvikInsn.vA = i; dvmCompilerPrependMIR(loopBody, phi); @@ -66,9 +72,12 @@ static void handlePhiPlacement(CompilationUnit *cUnit) static void fillPhiNodeContents(CompilationUnit *cUnit) { - BasicBlock *entry = cUnit->blockList[0]; - BasicBlock *loopBody = cUnit->blockList[1]; - BasicBlock *loopBranch = cUnit->blockList[2]; + BasicBlock *entry = + (BasicBlock *) dvmGrowableListGetElement(&cUnit->blockList, 0); + BasicBlock *loopBody = + (BasicBlock *) dvmGrowableListGetElement(&cUnit->blockList, 1); + BasicBlock *loopBranch = + (BasicBlock *) dvmGrowableListGetElement(&cUnit->blockList, 2); MIR *mir; for (mir = loopBody->firstMIRInsn; mir; mir = mir->next) { @@ -76,7 +85,7 @@ static void fillPhiNodeContents(CompilationUnit *cUnit) int dalvikReg = mir->dalvikInsn.vA; mir->ssaRep->numUses = 2; - mir->ssaRep->uses = dvmCompilerNew(sizeof(int) * 2, false); + mir->ssaRep->uses = (int *)dvmCompilerNew(sizeof(int) * 2, false); mir->ssaRep->uses[0] = DECODE_REG(entry->dataFlowInfo->dalvikToSSAMap[dalvikReg]); mir->ssaRep->uses[1] = @@ -165,7 +174,8 @@ static void dumpHoistedChecks(CompilationUnit *cUnit) static bool isLoopOptimizable(CompilationUnit *cUnit) { unsigned int i; - BasicBlock *loopBranch = cUnit->blockList[2]; + BasicBlock *loopBranch = + (BasicBlock *) dvmGrowableListGetElement(&cUnit->blockList, 2); LoopAnalysis *loopAnalysis = cUnit->loopAnalysis; if (loopAnalysis->numBasicIV != 1) return false; @@ -283,13 +293,14 @@ static void updateRangeCheckInfo(CompilationUnit *cUnit, int arrayReg, } if (arrayAccessInfo == NULL) { arrayAccessInfo = - dvmCompilerNew(sizeof(ArrayAccessInfo), false); + (ArrayAccessInfo *)dvmCompilerNew(sizeof(ArrayAccessInfo), + false); arrayAccessInfo->ivReg = ivInfo->basicSSAReg; arrayAccessInfo->arrayReg = arrayReg; arrayAccessInfo->maxC = (ivInfo->c > 0) ? ivInfo->c : 0; arrayAccessInfo->minC = (ivInfo->c < 0) ? ivInfo->c : 0; dvmInsertGrowableList(loopAnalysis->arrayAccessInfo, - arrayAccessInfo); + (intptr_t) arrayAccessInfo); } break; } @@ -299,7 +310,8 @@ static void updateRangeCheckInfo(CompilationUnit *cUnit, int arrayReg, /* Returns true if the loop body cannot throw any exceptions */ static bool doLoopBodyCodeMotion(CompilationUnit *cUnit) { - BasicBlock *loopBody = cUnit->blockList[1]; + BasicBlock *loopBody = + (BasicBlock *) dvmGrowableListGetElement(&cUnit->blockList, 1); MIR *mir; bool loopBodyCanThrow = false; @@ -386,7 +398,8 @@ static bool doLoopBodyCodeMotion(CompilationUnit *cUnit) static void genHoistedChecks(CompilationUnit *cUnit) { unsigned int i; - BasicBlock *entry = cUnit->blockList[0]; + BasicBlock *entry = + (BasicBlock *) dvmGrowableListGetElement(&cUnit->blockList, 0); LoopAnalysis *loopAnalysis = cUnit->loopAnalysis; int globalMaxC = 0; int globalMinC = 0; @@ -402,7 +415,7 @@ static void genHoistedChecks(CompilationUnit *cUnit) idxReg = DECODE_REG( dvmConvertSSARegToDalvik(cUnit, arrayAccessInfo->ivReg)); - MIR *rangeCheckMIR = dvmCompilerNew(sizeof(MIR), true); + MIR *rangeCheckMIR = (MIR *)dvmCompilerNew(sizeof(MIR), true); rangeCheckMIR->dalvikInsn.opcode = (loopAnalysis->isCountUpLoop) ? kMirOpNullNRangeUpCheck : kMirOpNullNRangeDownCheck; rangeCheckMIR->dalvikInsn.vA = arrayReg; @@ -422,7 +435,7 @@ static void genHoistedChecks(CompilationUnit *cUnit) if (loopAnalysis->arrayAccessInfo->numUsed != 0) { if (loopAnalysis->isCountUpLoop) { - MIR *boundCheckMIR = dvmCompilerNew(sizeof(MIR), true); + MIR *boundCheckMIR = (MIR *)dvmCompilerNew(sizeof(MIR), true); boundCheckMIR->dalvikInsn.opcode = kMirOpLowerBound; boundCheckMIR->dalvikInsn.vA = idxReg; boundCheckMIR->dalvikInsn.vB = globalMinC; @@ -430,7 +443,7 @@ static void genHoistedChecks(CompilationUnit *cUnit) } else { if (loopAnalysis->loopBranchOpcode == OP_IF_LT || loopAnalysis->loopBranchOpcode == OP_IF_LE) { - MIR *boundCheckMIR = dvmCompilerNew(sizeof(MIR), true); + MIR *boundCheckMIR = (MIR *)dvmCompilerNew(sizeof(MIR), true); boundCheckMIR->dalvikInsn.opcode = kMirOpLowerBound; boundCheckMIR->dalvikInsn.vA = loopAnalysis->endConditionReg; boundCheckMIR->dalvikInsn.vB = globalMinC; @@ -447,14 +460,14 @@ static void genHoistedChecks(CompilationUnit *cUnit) } else if (loopAnalysis->loopBranchOpcode == OP_IF_LTZ) { /* Array index will fall below 0 */ if (globalMinC < 0) { - MIR *boundCheckMIR = dvmCompilerNew(sizeof(MIR), true); + MIR *boundCheckMIR = (MIR *)dvmCompilerNew(sizeof(MIR), true); boundCheckMIR->dalvikInsn.opcode = kMirOpPunt; dvmCompilerAppendMIR(entry, boundCheckMIR); } } else if (loopAnalysis->loopBranchOpcode == OP_IF_LEZ) { /* Array index will fall below 0 */ if (globalMinC < -1) { - MIR *boundCheckMIR = dvmCompilerNew(sizeof(MIR), true); + MIR *boundCheckMIR = (MIR *)dvmCompilerNew(sizeof(MIR), true); boundCheckMIR->dalvikInsn.opcode = kMirOpPunt; dvmCompilerAppendMIR(entry, boundCheckMIR); } @@ -473,46 +486,61 @@ static void genHoistedChecks(CompilationUnit *cUnit) */ bool dvmCompilerLoopOpt(CompilationUnit *cUnit) { - LoopAnalysis *loopAnalysis = dvmCompilerNew(sizeof(LoopAnalysis), true); + LoopAnalysis *loopAnalysis = + (LoopAnalysis *)dvmCompilerNew(sizeof(LoopAnalysis), true); - assert(cUnit->blockList[0]->blockType == kTraceEntryBlock); - assert(cUnit->blockList[2]->blockType == kDalvikByteCode); - assert(cUnit->blockList[3]->blockType == kTraceExitBlock); + assert(((BasicBlock *) dvmGrowableListGetElement(&cUnit->blockList, 0)) + ->blockType == kTraceEntryBlock); + assert(((BasicBlock *) dvmGrowableListGetElement(&cUnit->blockList, 2)) + ->blockType == kDalvikByteCode); + assert(((BasicBlock *) dvmGrowableListGetElement(&cUnit->blockList, 3)) + ->blockType == kTraceExitBlock); cUnit->loopAnalysis = loopAnalysis; /* * Find live-in variables to the loop body so that we can fake their * definitions in the entry block. */ - dvmCompilerDataFlowAnalysisDispatcher(cUnit, dvmCompilerFindLiveIn); + dvmCompilerDataFlowAnalysisDispatcher(cUnit, dvmCompilerFindLocalLiveIn, + kAllNodes, + false /* isIterative */); /* Insert phi nodes to the loop body */ handlePhiPlacement(cUnit); - dvmCompilerDataFlowAnalysisDispatcher(cUnit, dvmCompilerDoSSAConversion); + dvmCompilerDataFlowAnalysisDispatcher(cUnit, dvmCompilerDoSSAConversion, + kAllNodes, + false /* isIterative */); fillPhiNodeContents(cUnit); /* Constant propagation */ cUnit->isConstantV = dvmAllocBitVector(cUnit->numSSARegs, false); - cUnit->constantValues = dvmCompilerNew(sizeof(int) * cUnit->numSSARegs, - true); + cUnit->constantValues = + (int *)dvmCompilerNew(sizeof(int) * cUnit->numSSARegs, + true); dvmCompilerDataFlowAnalysisDispatcher(cUnit, - dvmCompilerDoConstantPropagation); + dvmCompilerDoConstantPropagation, + kAllNodes, + false /* isIterative */); DEBUG_LOOP(dumpConstants(cUnit);) /* Find induction variables - basic and dependent */ - loopAnalysis->ivList = dvmCompilerNew(sizeof(GrowableList), true); + loopAnalysis->ivList = + (GrowableList *)dvmCompilerNew(sizeof(GrowableList), true); dvmInitGrowableList(loopAnalysis->ivList, 4); loopAnalysis->isIndVarV = dvmAllocBitVector(cUnit->numSSARegs, false); dvmCompilerDataFlowAnalysisDispatcher(cUnit, - dvmCompilerFindInductionVariables); + dvmCompilerFindInductionVariables, + kAllNodes, + false /* isIterative */); DEBUG_LOOP(dumpIVList(cUnit);) /* If the loop turns out to be non-optimizable, return early */ if (!isLoopOptimizable(cUnit)) return false; - loopAnalysis->arrayAccessInfo = dvmCompilerNew(sizeof(GrowableList), true); + loopAnalysis->arrayAccessInfo = + (GrowableList *)dvmCompilerNew(sizeof(GrowableList), true); dvmInitGrowableList(loopAnalysis->arrayAccessInfo, 4); loopAnalysis->bodyIsClean = doLoopBodyCodeMotion(cUnit); DEBUG_LOOP(dumpHoistedChecks(cUnit);) |