summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/442-checker-constant-folding/smali/TestCmp.smali138
-rw-r--r--test/442-checker-constant-folding/src/Main.java20
2 files changed, 155 insertions, 3 deletions
diff --git a/test/442-checker-constant-folding/smali/TestCmp.smali b/test/442-checker-constant-folding/smali/TestCmp.smali
index df631bc202..f55c837b17 100644
--- a/test/442-checker-constant-folding/smali/TestCmp.smali
+++ b/test/442-checker-constant-folding/smali/TestCmp.smali
@@ -330,3 +330,141 @@
cmpl-double v0, v1, v3
return v0
.end method
+
+
+## CHECK-START: int TestCmp.IntAddition2() constant_folding (before)
+## CHECK-DAG: <<Const1:i\d+>> IntConstant 1
+## CHECK-DAG: <<Const2:i\d+>> IntConstant 2
+## CHECK-DAG: <<Const5:i\d+>> IntConstant 5
+## CHECK-DAG: <<Const6:i\d+>> IntConstant 6
+## CHECK-DAG: <<Add1:i\d+>> Add [<<Const1>>,<<Const2>>]
+## CHECK-DAG: <<Add2:i\d+>> Add [<<Const5>>,<<Const6>>]
+## CHECK-DAG: <<Add3:i\d+>> Add [<<Add1>>,<<Add2>>]
+## CHECK-DAG: Return [<<Add3>>]
+
+## CHECK-START: int TestCmp.IntAddition2() constant_folding (after)
+## CHECK-DAG: <<Const14:i\d+>> IntConstant 14
+## CHECK-DAG: Return [<<Const14>>]
+
+## CHECK-START: int TestCmp.IntAddition2() constant_folding (after)
+## CHECK-NOT: Add
+.method public static IntAddition2()I
+ # A more direct translation from Java.
+
+ # int a, b, c;
+ .registers 3
+
+ # a = 1;
+ const/4 v0, 1
+ # b = 2;
+ const/4 v1, 2
+
+ # a += b;
+ add-int/2addr v0, v1
+
+ # b = 5;
+ const/4 v1, 5
+ # c = 6;
+ const/4 v2, 6
+
+ # b += c;
+ add-int/2addr v1, v2
+ # c = a + b;
+ add-int v2, v0, v1
+
+ # return c;
+ return v2
+.end method
+
+
+## CHECK-START: int TestCmp.IntAddition2AddAndMove() constant_folding (before)
+## CHECK-DAG: <<Const1:i\d+>> IntConstant 1
+## CHECK-DAG: <<Const2:i\d+>> IntConstant 2
+## CHECK-DAG: <<Const5:i\d+>> IntConstant 5
+## CHECK-DAG: <<Const6:i\d+>> IntConstant 6
+## CHECK-DAG: <<Add1:i\d+>> Add [<<Const1>>,<<Const2>>]
+## CHECK-DAG: <<Add2:i\d+>> Add [<<Const5>>,<<Const6>>]
+## CHECK-DAG: <<Add3:i\d+>> Add [<<Add1>>,<<Add2>>]
+## CHECK-DAG: Return [<<Add3>>]
+
+## CHECK-START: int TestCmp.IntAddition2AddAndMove() constant_folding (after)
+## CHECK-DAG: <<Const14:i\d+>> IntConstant 14
+## CHECK-DAG: Return [<<Const14>>]
+
+## CHECK-START: int TestCmp.IntAddition2AddAndMove() constant_folding (after)
+## CHECK-NOT: Add
+
+# D8 uses 3 registers for += when local variable info is presented.
+.method public static IntAddition2AddAndMove()I
+ .registers 4
+
+ # a = 1;
+ const/4 v0, 1
+ # b = 2;
+ const/4 v1, 2
+
+ # a += b;
+ add-int v2, v0, v1
+ move v0, v2
+
+ # b = 5;
+ const/4 v2, 5
+ move v1, v2
+
+ # c = 6;
+ const/4 v2, 6
+
+ # b += c;
+ add-int v3, v1, v2
+ move v1, v3
+
+ # c = a + b;
+ add-int v3, v0, v1
+ move v2, v3
+
+ # return c;
+ return v2
+.end method
+
+
+## CHECK-START: int TestCmp.JumpsAndConditionals(boolean) constant_folding (before)
+## CHECK-DAG: <<Const2:i\d+>> IntConstant 2
+## CHECK-DAG: <<Const5:i\d+>> IntConstant 5
+## CHECK-DAG: <<Add:i\d+>> Add [<<Const5>>,<<Const2>>]
+## CHECK-DAG: <<Sub:i\d+>> Sub [<<Const5>>,<<Const2>>]
+## CHECK-DAG: <<Phi:i\d+>> Phi [<<Add>>,<<Sub>>]
+## CHECK-DAG: Return [<<Phi>>]
+
+## CHECK-START: int TestCmp.JumpsAndConditionals(boolean) constant_folding (after)
+## CHECK-DAG: <<Const3:i\d+>> IntConstant 3
+## CHECK-DAG: <<Const7:i\d+>> IntConstant 7
+## CHECK-DAG: <<Phi:i\d+>> Phi [<<Const7>>,<<Const3>>]
+## CHECK-DAG: Return [<<Phi>>]
+
+## CHECK-START: int TestCmp.JumpsAndConditionals(boolean) constant_folding (after)
+## CHECK-NOT: Add
+## CHECK-NOT: Sub
+.method public static JumpsAndConditionals(Z)I
+ # int a, b, c;
+ # a = 5;
+ # b = 2;
+ # if (cond)
+ # c = a + b;
+ # else
+ # c = a - b;
+ # return c;
+ .registers 4
+
+ const/4 v0, 5
+ const/4 v1, 2
+
+ if-eqz p0, :cond_7
+ add-int v2, v0, v1
+
+ :goto_6
+ return v2
+
+ :cond_7
+ sub-int v2, v0, v1
+ goto :goto_6
+.end method
diff --git a/test/442-checker-constant-folding/src/Main.java b/test/442-checker-constant-folding/src/Main.java
index eba5137f6f..95c19eaabc 100644
--- a/test/442-checker-constant-folding/src/Main.java
+++ b/test/442-checker-constant-folding/src/Main.java
@@ -113,6 +113,19 @@ public class Main {
return (Integer)m.invoke(null);
}
+ public static int smaliIntAddition2() throws Exception {
+ Method m = Class.forName("TestCmp").getMethod("IntAddition2");
+ return (Integer)m.invoke(null);
+ }
+ public static int smaliIntAddition2AddAndMove() throws Exception {
+ Method m = Class.forName("TestCmp").getMethod("IntAddition2AddAndMove");
+ return (Integer)m.invoke(null);
+ }
+ public static int smaliJumpsAndConditionals(boolean cond) throws Exception {
+ Method m = Class.forName("TestCmp").getMethod("JumpsAndConditionals", boolean.class);
+ return (Integer)m.invoke(null, cond);
+ }
+
/**
* Exercise constant folding on negation.
@@ -225,11 +238,8 @@ public class Main {
/// CHECK-DAG: <<Const2:i\d+>> IntConstant 2
/// CHECK-DAG: <<Const5:i\d+>> IntConstant 5
/// CHECK-DAG: <<Const6:i\d+>> IntConstant 6
- /// CHECK-DAG: <<Const11:i\d+>> IntConstant 11
/// CHECK-DAG: <<Add1:i\d+>> Add [<<Const1>>,<<Const2>>]
/// CHECK-DAG: Add [<<Const5>>,<<Const6>>]
- /// CHECK-DAG: <<Add3:i\d+>> Add [<<Add1>>,<<Const11>>]
- /// CHECK-DAG: Return [<<Add3>>]
/// CHECK-START: int Main.IntAddition2() constant_folding (after)
/// CHECK-DAG: <<Const14:i\d+>> IntConstant 14
@@ -1520,6 +1530,8 @@ public class Main {
assertIntEquals(3, IntAddition1());
assertIntEquals(14, IntAddition2());
+ assertIntEquals(14, smaliIntAddition2());
+ assertIntEquals(14, smaliIntAddition2AddAndMove());
assertLongEquals(3L, LongAddition());
assertFloatEquals(3F, FloatAddition());
assertDoubleEquals(3D, DoubleAddition());
@@ -1567,6 +1579,8 @@ public class Main {
assertIntEquals(7, JumpsAndConditionals(true));
assertIntEquals(3, JumpsAndConditionals(false));
+ assertIntEquals(7, smaliJumpsAndConditionals(true));
+ assertIntEquals(3, smaliJumpsAndConditionals(false));
int arbitrary = 123456; // Value chosen arbitrarily.