Minor compiler tuning
Large switch statements were getting bogged down in a linear search.
Added a map for fast lookup (which may also be useful for debug
support).
Change-Id: I00e5956ea7e98ff2c870fb2d3e299e8d4c88f598
diff --git a/src/compiler/codegen/arm/Thumb2/Gen.cc b/src/compiler/codegen/arm/Thumb2/Gen.cc
index 9c4ef1e..1c2f850 100644
--- a/src/compiler/codegen/arm/Thumb2/Gen.cc
+++ b/src/compiler/codegen/arm/Thumb2/Gen.cc
@@ -129,21 +129,17 @@
*/
STATIC ArmLIR* insertCaseLabel(CompilationUnit* cUnit, int vaddr, int keyVal)
{
- ArmLIR* lir;
- for (lir = (ArmLIR*)cUnit->firstLIRInsn; lir; lir = NEXT_LIR(lir)) {
- if ((lir->opcode == kArmPseudoDalvikByteCodeBoundary) &&
- (lir->generic.dalvikOffset == vaddr)) {
- ArmLIR* newLabel = (ArmLIR*)oatNew(sizeof(ArmLIR), true);
- newLabel->generic.dalvikOffset = vaddr;
- newLabel->opcode = kArmPseudoCaseLabel;
- newLabel->operands[0] = keyVal;
- oatInsertLIRAfter((LIR*)lir, (LIR*)newLabel);
- return newLabel;
- }
+ std::map<unsigned int, LIR*>::iterator it;
+ it = cUnit->boundaryMap.find(vaddr);
+ if (it == cUnit->boundaryMap.end()) {
+ LOG(FATAL) << "Error: didn't find vaddr 0x" << std::hex << vaddr;
}
- oatCodegenDump(cUnit);
- LOG(FATAL) << "Error: didn't find vaddr 0x" << std::hex << vaddr;
- return NULL; // Quiet gcc
+ ArmLIR* newLabel = (ArmLIR*)oatNew(sizeof(ArmLIR), true);
+ newLabel->generic.dalvikOffset = vaddr;
+ newLabel->opcode = kArmPseudoCaseLabel;
+ newLabel->operands[0] = keyVal;
+ oatInsertLIRAfter(it->second, (LIR*)newLabel);
+ return newLabel;
}
STATIC void markPackedCaseLabels(CompilationUnit* cUnit, SwitchTable *tabRec)