OSDN Git Service

Do not expect 0 or 1 only when comparing a boolean.
authorNicolas Geoffray <ngeoffray@google.com>
Fri, 19 Jun 2015 10:42:07 +0000 (11:42 +0100)
committerNicolas Geoffray <ngeoffray@google.com>
Mon, 22 Jun 2015 10:59:53 +0000 (11:59 +0100)
bug:21866529

(cherry picked from commit 3c4ab80c102ff1bfc0e74d4abddbf5454bf4008d)

Change-Id: Ibdc0d4a9730bfc6e7307282276f084dae5ac55c1

compiler/optimizing/instruction_simplifier.cc
test/507-boolean-test/expected.txt [new file with mode: 0644]
test/507-boolean-test/info.txt [new file with mode: 0644]
test/507-boolean-test/src/Main.java [new file with mode: 0644]

index 46fad17..0ca676a 100644 (file)
@@ -221,14 +221,15 @@ void InstructionSimplifierVisitor::VisitEqual(HEqual* equal) {
     HInstruction* input_value = equal->GetLeastConstantLeft();
     if (input_value->GetType() == Primitive::kPrimBoolean && input_const->IsIntConstant()) {
       HBasicBlock* block = equal->GetBlock();
+      // We are comparing the boolean to a constant which is of type int and can
+      // be any constant.
       if (input_const->AsIntConstant()->IsOne()) {
         // Replace (bool_value == true) with bool_value
         equal->ReplaceWith(input_value);
         block->RemoveInstruction(equal);
         RecordSimplification();
-      } else {
+      } else if (input_const->AsIntConstant()->IsZero()) {
         // Replace (bool_value == false) with !bool_value
-        DCHECK(input_const->AsIntConstant()->IsZero());
         block->ReplaceAndRemoveInstructionWith(
             equal, new (block->GetGraph()->GetArena()) HBooleanNot(input_value));
         RecordSimplification();
@@ -243,14 +244,15 @@ void InstructionSimplifierVisitor::VisitNotEqual(HNotEqual* not_equal) {
     HInstruction* input_value = not_equal->GetLeastConstantLeft();
     if (input_value->GetType() == Primitive::kPrimBoolean && input_const->IsIntConstant()) {
       HBasicBlock* block = not_equal->GetBlock();
+      // We are comparing the boolean to a constant which is of type int and can
+      // be any constant.
       if (input_const->AsIntConstant()->IsOne()) {
         // Replace (bool_value != true) with !bool_value
         block->ReplaceAndRemoveInstructionWith(
             not_equal, new (block->GetGraph()->GetArena()) HBooleanNot(input_value));
         RecordSimplification();
-      } else {
+      } else if (input_const->AsIntConstant()->IsZero()) {
         // Replace (bool_value != false) with bool_value
-        DCHECK(input_const->AsIntConstant()->IsZero());
         not_equal->ReplaceWith(input_value);
         block->RemoveInstruction(not_equal);
         RecordSimplification();
diff --git a/test/507-boolean-test/expected.txt b/test/507-boolean-test/expected.txt
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/test/507-boolean-test/info.txt b/test/507-boolean-test/info.txt
new file mode 100644 (file)
index 0000000..15c20c1
--- /dev/null
@@ -0,0 +1,2 @@
+Regression test for the optimizing compiler that used to
+crash when compiling (a ? 1 : 0) == 2.
diff --git a/test/507-boolean-test/src/Main.java b/test/507-boolean-test/src/Main.java
new file mode 100644 (file)
index 0000000..f3ce92a
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+public class Main {
+  public static void main(String[] args) {
+    if (bar(true)) {
+      throw new Error("Expected false, got true");
+    }
+  }
+
+  public static boolean bar(boolean a) {
+    return (a ? 0 : 1) == 2;
+  }
+}