Bug fixes for ld/st elimination.
1) Only optimize each block once. Strictly speaking this is not a
correctness issue however it triggers the subsequent problem.
2) Ignore dead instructions.
1: ldr r2, [r5, #8]
2: ldr r3, [r5, #8](nop)
3: str r3, [r5, #4]
4: movs r3, r2
When using instruction 1 to initiate redundant ld/st eliminations, if
instruction 2 (which is already dead) is not ignored, it will be turned
into a "mov r3, r2" and that will clobber r3 used by the str.
Change-Id: I8eecd13eeb30e4a67ecf1f8fbad925b1e6e91fc8
diff --git a/vm/compiler/codegen/arm/CodegenDriver.c b/vm/compiler/codegen/arm/CodegenDriver.c
index 599df90..e94fc11 100644
--- a/vm/compiler/codegen/arm/CodegenDriver.c
+++ b/vm/compiler/codegen/arm/CodegenDriver.c
@@ -4575,6 +4575,8 @@
*/
dvmCompilerApplyLocalOptimizations(cUnit, (LIR *) headLIR,
cUnit->lastLIRInsn);
+ /* Reset headLIR which is also the optimization boundary */
+ headLIR = NULL;
}
gen_fallthrough: