diff options
| author | 2012-09-09 14:41:03 -0700 | |
|---|---|---|
| committer | 2012-09-09 14:41:03 -0700 | |
| commit | 1a0806c6847a9dc5cc6d73460d7e8ad3183b5c49 (patch) | |
| tree | 380a8b0796e3ee94072457013de1ad8e94e9a287 /src/compiler/codegen | |
| parent | 324e190e9de0d81d39d88474e189acef9b10bcc8 (diff) | |
| parent | d1643e41ef242ae656f667bf3c8b0324635cefd3 (diff) | |
Merge "Basic block combine pass" into dalvik-dev
Diffstat (limited to 'src/compiler/codegen')
| -rw-r--r-- | src/compiler/codegen/CodegenUtil.cc | 17 | ||||
| -rw-r--r-- | src/compiler/codegen/MethodBitcode.cc | 15 | ||||
| -rw-r--r-- | src/compiler/codegen/MethodCodegenDriver.cc | 13 | ||||
| -rw-r--r-- | src/compiler/codegen/arm/Thumb2/Gen.cc | 5 |
4 files changed, 27 insertions, 23 deletions
diff --git a/src/compiler/codegen/CodegenUtil.cc b/src/compiler/codegen/CodegenUtil.cc index 3aea76a4cc..bdc2c8b207 100644 --- a/src/compiler/codegen/CodegenUtil.cc +++ b/src/compiler/codegen/CodegenUtil.cc @@ -998,5 +998,20 @@ void dumpPackedSwitchTable(const u2* table) } } +/* + * Set up special LIR to mark a Dalvik byte-code instruction start and + * record it in the boundaryMap. NOTE: in cases such as kMirOpCheck in + * which we split a single Dalvik instruction, only the first MIR op + * associated with a Dalvik PC should be entered into the map. + */ +LIR* markBoundary(CompilationUnit* cUnit, int offset, const char* instStr) +{ + LIR* res = newLIR1(cUnit, kPseudoDalvikByteCodeBoundary, (intptr_t) instStr); + if (cUnit->boundaryMap.find(offset) == cUnit->boundaryMap.end()) { + cUnit->boundaryMap.Put(offset, res); + } + return res; +} -} // namespace art +} + // namespace art diff --git a/src/compiler/codegen/MethodBitcode.cc b/src/compiler/codegen/MethodBitcode.cc index cfe6e6a517..8d62750a49 100644 --- a/src/compiler/codegen/MethodBitcode.cc +++ b/src/compiler/codegen/MethodBitcode.cc @@ -1668,8 +1668,11 @@ void convertExtendedMIR(CompilationUnit* cUnit, BasicBlock* bb, MIR* mir, DCHECK_EQ(rlDest.fp, loc.fp); DCHECK_EQ(rlDest.core, loc.core); DCHECK_EQ(rlDest.ref, loc.ref); + SafeMap<unsigned int, unsigned int>::iterator it; + it = cUnit->blockIdMap.find(incoming[i]); + DCHECK(it != cUnit->blockIdMap.end()); phi->addIncoming(getLLVMValue(cUnit, loc.origSReg), - getLLVMBlock(cUnit, incoming[i])); + getLLVMBlock(cUnit, it->second)); } defineValue(cUnit, phi, rlDest.origSReg); break; @@ -1752,6 +1755,7 @@ void setMethodInfo(CompilationUnit* cUnit) /* Handle the content in each basic block */ bool methodBlockBitcodeConversion(CompilationUnit* cUnit, BasicBlock* bb) { + if (bb->blockType == kDead) return false; llvm::BasicBlock* llvmBB = getLLVMBlock(cUnit, bb->id); cUnit->irb->SetInsertPoint(llvmBB); setDexOffset(cUnit, bb->startOffset); @@ -1964,7 +1968,7 @@ bool createFunction(CompilationUnit* cUnit) { bool createLLVMBasicBlock(CompilationUnit* cUnit, BasicBlock* bb) { // Skip the exit block - if (bb->blockType == kExitBlock) { + if ((bb->blockType == kDead) ||(bb->blockType == kExitBlock)) { cUnit->idToBlockMap.Put(bb->id, NULL); } else { int offset = bb->startOffset; @@ -2924,11 +2928,8 @@ bool methodBitcodeBlockCodeGen(CompilationUnit* cUnit, llvm::BasicBlock* bb) cUnit->liveSReg = INVALID_SREG; #endif - LIR* boundaryLIR; - const char* instStr = "boundary"; - boundaryLIR = newLIR1(cUnit, kPseudoDalvikByteCodeBoundary, - (intptr_t) instStr); - cUnit->boundaryMap.Overwrite(cUnit->currentDalvikOffset, boundaryLIR); + // TODO: use llvm opcode name here instead of "boundary" if verbose + LIR* boundaryLIR = markBoundary(cUnit, cUnit->currentDalvikOffset, "boundary"); /* Remember the first LIR for thisl block*/ if (headLIR == NULL) { diff --git a/src/compiler/codegen/MethodCodegenDriver.cc b/src/compiler/codegen/MethodCodegenDriver.cc index b4e14ce52a..e76834d7c6 100644 --- a/src/compiler/codegen/MethodCodegenDriver.cc +++ b/src/compiler/codegen/MethodCodegenDriver.cc @@ -881,14 +881,7 @@ bool methodBlockCodeGen(CompilationUnit* cUnit, BasicBlock* bb) oatResetRegPool(cUnit); oatResetDefTracking(cUnit); - /* - * If control reached us from our immediate predecessor via - * fallthrough and we have no other incoming arcs we can - * reuse existing liveness. Otherwise, reset. - */ - if (!bb->fallThroughTarget || bb->predecessors->numUsed != 1) { - oatClobberAllRegs(cUnit); - } + oatClobberAllRegs(cUnit); LIR* headLIR = NULL; @@ -922,9 +915,7 @@ bool methodBlockCodeGen(CompilationUnit* cUnit, BasicBlock* bb) /* Mark the beginning of a Dalvik instruction for line tracking */ char* instStr = cUnit->printMe ? oatGetDalvikDisassembly(cUnit, mir->dalvikInsn, "") : NULL; - boundaryLIR = newLIR1(cUnit, kPseudoDalvikByteCodeBoundary, - (intptr_t) instStr); - cUnit->boundaryMap.Overwrite(mir->offset, boundaryLIR); + boundaryLIR = markBoundary(cUnit, mir->offset, instStr); /* Remember the first LIR for this block */ if (headLIR == NULL) { headLIR = boundaryLIR; diff --git a/src/compiler/codegen/arm/Thumb2/Gen.cc b/src/compiler/codegen/arm/Thumb2/Gen.cc index d2532b7a47..925bbf2151 100644 --- a/src/compiler/codegen/arm/Thumb2/Gen.cc +++ b/src/compiler/codegen/arm/Thumb2/Gen.cc @@ -127,13 +127,10 @@ MIR* getNextMir(CompilationUnit* cUnit, BasicBlock** pBb, MIR* mir) /* Used for the "printMe" listing */ void genPrintLabel(CompilationUnit *cUnit, MIR* mir) { - LIR* boundaryLIR; /* Mark the beginning of a Dalvik instruction for line tracking */ char* instStr = cUnit->printMe ? oatGetDalvikDisassembly(cUnit, mir->dalvikInsn, "") : NULL; - boundaryLIR = newLIR1(cUnit, kPseudoDalvikByteCodeBoundary, - (intptr_t) instStr); - cUnit->boundaryMap.Put(mir->offset, boundaryLIR); + markBoundary(cUnit, mir->offset, instStr); /* Don't generate the SSA annotation unless verbose mode is on */ if (cUnit->printMe && mir->ssaRep) { char* ssaString = oatGetSSAString(cUnit, mir->ssaRep); |