From 9d894662426e413454935e483d56a8cc33924174 Mon Sep 17 00:00:00 2001 From: Alexei Zavjalov Date: Mon, 21 Apr 2014 20:45:24 +0700 Subject: [PATCH] Skip BBs without SSA representation in the Constant Propagation phase In some cases the constant propagation optimization may get the MIR graph where some of the BBs have no predecessors and do not transformed to the SSA form. If such BB has operations on constants this may lead to segfault. This patch adds the condition that will pass the only BBs with SSA. Change-Id: I816d46b2492c5bd4748f983c3725b4798f9ebd68 Signed-off-by: Alexei Zavjalov --- compiler/dex/mir_optimization.cc | 5 +++++ test/083-compiler-regressions/expected.txt | 1 + test/083-compiler-regressions/src/Main.java | 27 +++++++++++++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/compiler/dex/mir_optimization.cc b/compiler/dex/mir_optimization.cc index 51419f458..937e2585e 100644 --- a/compiler/dex/mir_optimization.cc +++ b/compiler/dex/mir_optimization.cc @@ -42,6 +42,11 @@ void MIRGraph::DoConstantPropagation(BasicBlock* bb) { MIR* mir; for (mir = bb->first_mir_insn; mir != NULL; mir = mir->next) { + // Skip pass if BB has MIR without SSA representation. + if (mir->ssa_rep == NULL) { + return; + } + uint64_t df_attributes = oat_data_flow_attributes_[mir->dalvikInsn.opcode]; DecodedInstruction *d_insn = &mir->dalvikInsn; diff --git a/test/083-compiler-regressions/expected.txt b/test/083-compiler-regressions/expected.txt index db5030022..7576b0275 100644 --- a/test/083-compiler-regressions/expected.txt +++ b/test/083-compiler-regressions/expected.txt @@ -16,6 +16,7 @@ b13679511Test finishing largeFrame passes largeFrameFloat passes mulBy1Test passes +constantPropagationTest passes getterSetterTest passes identityTest passes wideGetterSetterTest passes diff --git a/test/083-compiler-regressions/src/Main.java b/test/083-compiler-regressions/src/Main.java index d32c037af..6a12ca93f 100644 --- a/test/083-compiler-regressions/src/Main.java +++ b/test/083-compiler-regressions/src/Main.java @@ -38,6 +38,7 @@ public class Main { largeFrameTest(); largeFrameTestFloat(); mulBy1Test(); + constantPropagationTest(); getterSetterTest(); identityTest(); wideGetterSetterTest(); @@ -766,6 +767,32 @@ public class Main { } } + static void constantPropagationTest() { + int i = 1; + int t = 1; + float z = 1F; + long h = 1L; + int g[] = new int[1]; + int w = 1; + long f = 0; + + for (int a = 1; a < 100; a++) { + try { + i = (int)(z); + h >>= (0 % t); + } + finally { + w = (int)(2 * (f * 6)); + } + } + + if (w == 0 && h == 1 && g[0] == 0) { + System.out.println("constantPropagationTest passes"); + } else { + System.out.println("constantPropagationTest fails"); + } + } + static void b2296099Test() throws Exception { int x = -1190771042; int dist = 360530809; -- 2.11.0