aboutsummaryrefslogtreecommitdiff
path: root/vm/compiler/codegen/arm/LocalOptimizations.cpp
diff options
context:
space:
mode:
authorBen Cheng <bccheng@android.com>2011-04-22 17:16:42 -0700
committerbuzbee <buzbee@google.com>2011-04-23 10:34:13 -0700
commit243db252574a78ff7326e7446d9042e321314c4f (patch)
tree6a31b4b9a5dcee556b2a6b8767cf78a0ce642463 /vm/compiler/codegen/arm/LocalOptimizations.cpp
parent0ed5b9bf184b97b0d3fa2ef5a9f3dacd3e186e46 (diff)
Local optimization fixes for diverences found by self verification.
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: I6b9a88d3688889d917b90f4b8f55278df1701c6a
Diffstat (limited to 'vm/compiler/codegen/arm/LocalOptimizations.cpp')
-rw-r--r--vm/compiler/codegen/arm/LocalOptimizations.cpp10
1 files changed, 10 insertions, 0 deletions
diff --git a/vm/compiler/codegen/arm/LocalOptimizations.cpp b/vm/compiler/codegen/arm/LocalOptimizations.cpp
index 4c0354ac8..ffeaa576f 100644
--- a/vm/compiler/codegen/arm/LocalOptimizations.cpp
+++ b/vm/compiler/codegen/arm/LocalOptimizations.cpp
@@ -131,6 +131,12 @@ static void applyLoadStoreElimination(CompilationUnit *cUnit,
checkLIR != tailLIR;
checkLIR = NEXT_LIR(checkLIR)) {
+ /*
+ * Skip already dead instructions (whose dataflow information is
+ * outdated and misleading).
+ */
+ if (checkLIR->flags.isNop) continue;
+
u8 checkMemMask = (checkLIR->useMask | checkLIR->defMask) &
ENCODE_MEM;
u8 aliasCondition = thisMemMask & checkMemMask;
@@ -312,6 +318,10 @@ static void applyLoadHoisting(CompilationUnit *cUnit,
checkLIR != headLIR;
checkLIR = PREV_LIR(checkLIR)) {
+ /*
+ * Skip already dead instructions (whose dataflow information is
+ * outdated and misleading).
+ */
if (checkLIR->flags.isNop) continue;
u8 checkMemMask = checkLIR->defMask & ENCODE_MEM;