diff options
| -rw-r--r-- | compiler/optimizing/boolean_simplifier.cc | 14 | ||||
| -rw-r--r-- | test/468-bool-simplifier-regression/expected.txt | 0 | ||||
| -rw-r--r-- | test/468-bool-simplifier-regression/info.txt | 2 | ||||
| -rw-r--r-- | test/468-bool-simplifier-regression/smali/TestCase.smali | 32 | ||||
| -rw-r--r-- | test/468-bool-simplifier-regression/src/Main.java | 37 |
5 files changed, 77 insertions, 8 deletions
diff --git a/compiler/optimizing/boolean_simplifier.cc b/compiler/optimizing/boolean_simplifier.cc index ab77505b6f..be432c5a20 100644 --- a/compiler/optimizing/boolean_simplifier.cc +++ b/compiler/optimizing/boolean_simplifier.cc @@ -59,7 +59,8 @@ static HInstruction* GetOppositeCondition(HInstruction* cond) { return new (allocator) HGreaterThan(lhs, rhs); } else if (cond->IsGreaterThan()) { return new (allocator) HLessThanOrEqual(lhs, rhs); - } else if (cond->IsGreaterThanOrEqual()) { + } else { + DCHECK(cond->IsGreaterThanOrEqual()); return new (allocator) HLessThan(lhs, rhs); } } else if (cond->IsIntConstant()) { @@ -70,10 +71,11 @@ static HInstruction* GetOppositeCondition(HInstruction* cond) { DCHECK(int_const->IsOne()); return graph->GetIntConstant(0); } + } else { + // General case when 'cond' is another instruction of type boolean. + // Negate with 'cond == 0'. + return new (allocator) HEqual(cond, graph->GetIntConstant(0)); } - - // TODO: b/19992954 - return nullptr; } void HBooleanSimplifier::Run() { @@ -105,10 +107,6 @@ void HBooleanSimplifier::Run() { HInstruction* replacement; if (NegatesCondition(true_value, false_value)) { replacement = GetOppositeCondition(if_condition); - if (replacement == nullptr) { - // Something we could not handle. - continue; - } if (replacement->GetBlock() == nullptr) { block->InsertInstructionBefore(replacement, if_instruction); } diff --git a/test/468-bool-simplifier-regression/expected.txt b/test/468-bool-simplifier-regression/expected.txt new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/test/468-bool-simplifier-regression/expected.txt diff --git a/test/468-bool-simplifier-regression/info.txt b/test/468-bool-simplifier-regression/info.txt new file mode 100644 index 0000000000..0a465846b1 --- /dev/null +++ b/test/468-bool-simplifier-regression/info.txt @@ -0,0 +1,2 @@ +Regression test for optimizing's boolean simplifier +that used to trip when a boolean value was the input of an If. diff --git a/test/468-bool-simplifier-regression/smali/TestCase.smali b/test/468-bool-simplifier-regression/smali/TestCase.smali new file mode 100644 index 0000000000..f36304d333 --- /dev/null +++ b/test/468-bool-simplifier-regression/smali/TestCase.smali @@ -0,0 +1,32 @@ +# 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. + +.class public LTestCase; + +.super Ljava/lang/Object; + +.field public static value:Z + +.method public static testCase()Z + .registers 2 + sget-boolean v0, LTestCase;->value:Z + const/4 v1, 1 + if-eq v0, v1, :label1 + const/4 v1, 1 + goto :label2 + :label1 + const/4 v1, 0 + :label2 + return v1 +.end method diff --git a/test/468-bool-simplifier-regression/src/Main.java b/test/468-bool-simplifier-regression/src/Main.java new file mode 100644 index 0000000000..1dd27c9287 --- /dev/null +++ b/test/468-bool-simplifier-regression/src/Main.java @@ -0,0 +1,37 @@ +/* + * 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. + */ + +import java.lang.reflect.*; + +public class Main { + public static boolean runTest(boolean input) throws Exception { + Class<?> c = Class.forName("TestCase"); + Method m = c.getMethod("testCase"); + Field f = c.getField("value"); + f.set(null, (Boolean) input); + return (Boolean) m.invoke(null); + } + + public static void main(String[] args) throws Exception { + if (runTest(true) != false) { + throw new Error("Expected false, got true"); + } + + if (runTest(false) != true) { + throw new Error("Expected true, got false"); + } + } +} |