ART: Extend list of instructions accepted as boolean inputs
Previous change allowed integer Phis as inputs of instructions
expecting a boolean type. This list, however, was not exhaustive as
binary operations And, Or and Xor are also valid inputs. This patch
extends the list in SSAChecker.
Change-Id: I5b5c9e7a17992cc4987e3a078ee23ea80028ecfc
diff --git a/test/474-checker-boolean-input/src/Main.java b/test/474-checker-boolean-input/src/Main.java
index 91e8d4f..1ebe14e 100644
--- a/test/474-checker-boolean-input/src/Main.java
+++ b/test/474-checker-boolean-input/src/Main.java
@@ -23,14 +23,14 @@
}
/*
- * Test that zero/one constants are accepted as boolean inputs.
+ * Test that zero/one constants are accepted as Boolean inputs.
*/
- // CHECK-START: boolean Main.TestIntAsBoolean() inliner (before)
+ // CHECK-START: boolean Main.TestConstAsBoolean() inliner (before)
// CHECK-DAG: [[Invoke:z\d+]] InvokeStaticOrDirect
// CHECK-DAG: BooleanNot [ [[Invoke]] ]
- // CHECK-START: boolean Main.TestIntAsBoolean() inliner (after)
+ // CHECK-START: boolean Main.TestConstAsBoolean() inliner (after)
// CHECK-DAG: [[Const:i\d+]] IntConstant 1
// CHECK-DAG: BooleanNot [ [[Const]] ]
@@ -38,13 +38,13 @@
return true;
}
- public static boolean TestIntAsBoolean() {
+ public static boolean TestConstAsBoolean() {
return InlineConst() != true ? true : false;
}
/*
- * Test that integer Phis are accepted as boolean inputs until we implement
- * a suitable type analysis.
+ * Test that integer Phis are accepted as Boolean inputs until
+ * we implement a suitable type analysis.
*/
// CHECK-START: boolean Main.TestPhiAsBoolean(int) inliner (before)
@@ -66,10 +66,80 @@
return InlinePhi(x) != true ? true : false;
}
+ /*
+ * Test that integer And is accepted as a Boolean input until
+ * we implement a suitable type analysis.
+ */
+
+ // CHECK-START: boolean Main.TestAndAsBoolean(boolean, boolean) inliner (before)
+ // CHECK-DAG: [[Invoke:z\d+]] InvokeStaticOrDirect
+ // CHECK-DAG: BooleanNot [ [[Invoke]] ]
+
+ // CHECK-START: boolean Main.TestAndAsBoolean(boolean, boolean) inliner (after)
+ // CHECK-DAG: [[And:i\d+]] And
+ // CHECK-DAG: BooleanNot [ [[And]] ]
+
+ public static boolean InlineAnd(boolean x, boolean y) {
+ return x & y;
+ }
+
+ public static boolean TestAndAsBoolean(boolean x, boolean y) {
+ return InlineAnd(x, y) != true ? true : false;
+ }
+
+ /*
+ * Test that integer Or is accepted as a Boolean input until
+ * we implement a suitable type analysis.
+ */
+
+ // CHECK-START: boolean Main.TestOrAsBoolean(boolean, boolean) inliner (before)
+ // CHECK-DAG: [[Invoke:z\d+]] InvokeStaticOrDirect
+ // CHECK-DAG: BooleanNot [ [[Invoke]] ]
+
+ // CHECK-START: boolean Main.TestOrAsBoolean(boolean, boolean) inliner (after)
+ // CHECK-DAG: [[Or:i\d+]] Or
+ // CHECK-DAG: BooleanNot [ [[Or]] ]
+
+ public static boolean InlineOr(boolean x, boolean y) {
+ return x | y;
+ }
+
+ public static boolean TestOrAsBoolean(boolean x, boolean y) {
+ return InlineOr(x, y) != true ? true : false;
+ }
+
+ /*
+ * Test that integer Xor is accepted as a Boolean input until
+ * we implement a suitable type analysis.
+ */
+
+ // CHECK-START: boolean Main.TestXorAsBoolean(boolean, boolean) inliner (before)
+ // CHECK-DAG: [[Invoke:z\d+]] InvokeStaticOrDirect
+ // CHECK-DAG: BooleanNot [ [[Invoke]] ]
+
+ // CHECK-START: boolean Main.TestXorAsBoolean(boolean, boolean) inliner (after)
+ // CHECK-DAG: [[Xor:i\d+]] Xor
+ // CHECK-DAG: BooleanNot [ [[Xor]] ]
+
+ public static boolean InlineXor(boolean x, boolean y) {
+ return x ^ y;
+ }
+
+ public static boolean TestXorAsBoolean(boolean x, boolean y) {
+ return InlineXor(x, y) != true ? true : false;
+ }
+
public static void main(String[] args) {
f1 = true;
f2 = false;
+ assertBoolEquals(false, TestConstAsBoolean());
assertBoolEquals(true, TestPhiAsBoolean(0));
assertBoolEquals(false, TestPhiAsBoolean(42));
+ assertBoolEquals(true, TestAndAsBoolean(true, false));
+ assertBoolEquals(false, TestAndAsBoolean(true, true));
+ assertBoolEquals(true, TestOrAsBoolean(false, false));
+ assertBoolEquals(false, TestOrAsBoolean(true, true));
+ assertBoolEquals(true, TestXorAsBoolean(true, true));
+ assertBoolEquals(false, TestXorAsBoolean(true, false));
}
}