Merge "Add an annotation for tests that need runtime prebuilts" into ub-jack-carnac
diff --git a/jack-tests/tests/com/android/jack/optimizations/notsimplifier/test001/dx/Tests.java b/jack-tests/tests/com/android/jack/optimizations/notsimplifier/test001/dx/Tests.java
index e4027e8..8304671 100644
--- a/jack-tests/tests/com/android/jack/optimizations/notsimplifier/test001/dx/Tests.java
+++ b/jack-tests/tests/com/android/jack/optimizations/notsimplifier/test001/dx/Tests.java
@@ -146,4 +146,22 @@
     Assert.assertFalse(NotSimplifier.test015(false, true));
     Assert.assertTrue(NotSimplifier.test015(true, false));
   }
+
+  @Test
+  public void test016() {
+    Assert.assertTrue(NotSimplifier.test016(false, true));
+    Assert.assertFalse(NotSimplifier.test016(false, false));
+  }
+
+  @Test
+  public void test017() {
+    Assert.assertTrue(NotSimplifier.test017(false, true));
+    Assert.assertFalse(NotSimplifier.test017(false, false));
+  }
+
+  @Test
+  public void test018() {
+    Assert.assertTrue(NotSimplifier.test017(false, true));
+    Assert.assertFalse(NotSimplifier.test017(false, false));
+  }
 }
diff --git a/jack-tests/tests/com/android/jack/optimizations/notsimplifier/test001/jack/NotSimplifier.java b/jack-tests/tests/com/android/jack/optimizations/notsimplifier/test001/jack/NotSimplifier.java
index 0a39a33..ae11792 100644
--- a/jack-tests/tests/com/android/jack/optimizations/notsimplifier/test001/jack/NotSimplifier.java
+++ b/jack-tests/tests/com/android/jack/optimizations/notsimplifier/test001/jack/NotSimplifier.java
@@ -133,4 +133,24 @@
     // Check that expression is replaced by b1 & !b2
     return !(!b1 | b2);
   }
+
+  public static boolean test016(boolean b1, boolean b2) {
+    return !(!b1 && (b2 ^ true));
+  }
+
+  public static boolean test017(boolean b1, boolean b2) {
+    // Make sure the subexpression are correctly by replacing
+    // b1 = (!(!b1 && (b2 ^ true)))
+    boolean result1 = !(!b1 && (b2 ^ true));
+    boolean result2 = !(!(!(!b1 && (b2 ^ true))) && (b2 ^ true));
+    boolean result3 = !(!(!(!(!(!b1 && (b2 ^ true))) && (b2 ^ true))) && (b2 ^ true));
+    boolean result4 =
+        !(!(!(!(!(!(!(!b1 && (b2 ^ true))) && (b2 ^ true))) && (b2 ^ true))) && (b2 ^ true));
+    return result1 && result2 && result3 && result4;
+  }
+
+  public static boolean test018(boolean b1, boolean b2) {
+    // Exact statement from the bug report.
+    return !(!(new Boolean(b1))  & (b2 ^ true));
+  }
 }
diff --git a/jack/src/com/android/jack/ir/ast/JBinaryOperator.java b/jack/src/com/android/jack/ir/ast/JBinaryOperator.java
index 5b444da..1c39b1b 100644
--- a/jack/src/com/android/jack/ir/ast/JBinaryOperator.java
+++ b/jack/src/com/android/jack/ir/ast/JBinaryOperator.java
@@ -73,6 +73,14 @@
       case BIT_OR: {
         return BIT_AND;
       }
+      // XOR:          EQ:
+      // T XOR T = F   T EQ T = T
+      // T XOR F = T   T EQ F = F
+      // F XOR T = T   F EQ T = F
+      // F XOR F = F   F EQ F = T
+      case BIT_XOR: {
+        return EQ;
+      }
       case AND: {
         return OR;
       }
diff --git a/jack/src/com/android/jack/optimizations/NotSimplifier.java b/jack/src/com/android/jack/optimizations/NotSimplifier.java
index 04d08db..a925e9a 100644
--- a/jack/src/com/android/jack/optimizations/NotSimplifier.java
+++ b/jack/src/com/android/jack/optimizations/NotSimplifier.java
@@ -154,16 +154,13 @@
           Jack.getSession().getPhantomLookup().getClass(CommonTypes.JAVA_LANG_BOOLEAN));
       JBinaryOperator op = binaryOp.getOp();
 
-      if (op.isComparison() || op.isConditionalOperation()
-          || op == JBinaryOperator.BIT_AND
-          || op == JBinaryOperator.BIT_OR) {
-        try {
-          tr.append(new Replace(binaryOp, JBinaryOperation.create(binaryOp.getSourceInfo(),
-              binaryOp.getOp().getReverseOperator(), binaryOp.getLhs(),
-              binaryOp.getRhs())));
-        } catch (UnsupportedOperatorException e) {
-          throw new JNodeInternalError("Failures into not simplifier", e);
-        }
+      assert op.isComparison() || op.isConditionalOperation() || op == JBinaryOperator.BIT_AND
+          || op == JBinaryOperator.BIT_OR || op == JBinaryOperator.BIT_XOR;
+      try {
+        tr.append(new Replace(binaryOp, JBinaryOperation.create(binaryOp.getSourceInfo(),
+            binaryOp.getOp().getReverseOperator(), binaryOp.getLhs(), binaryOp.getRhs())));
+      } catch (UnsupportedOperatorException e) {
+        throw new JNodeInternalError("Failures into not simplifier", e);
       }
 
       // Continue to inverse operator only if it is '&&', '||', '|', '&' otherwise stop inversion.