diff options
author | 2025-01-28 16:39:48 +0000 | |
---|---|---|
committer | 2025-01-29 04:53:29 -0800 | |
commit | 465a50fce239660baeec54dee8572621cbd0c79b (patch) | |
tree | 69e115e49424851efa08900d5a189b78056c191b | |
parent | 72345a79d5def4b05419cadf0bbcd98bf9265346 (diff) |
Optimizing: Fix `SimplifyIfs()` for FP bias mismatch.
Test: m test-art-host-test
Test: testrunner.py --host --optimizing --interpreter
Change-Id: I8fd0cfa02ed3242c84143a4a99a76a4fec95a4ee
-rw-r--r-- | compiler/optimizing/dead_code_elimination.cc | 3 | ||||
-rw-r--r-- | test/2255-checker-branch-redirection/src/Main.java | 53 |
2 files changed, 55 insertions, 1 deletions
diff --git a/compiler/optimizing/dead_code_elimination.cc b/compiler/optimizing/dead_code_elimination.cc index c5ec0b93b2..b8cd39e77f 100644 --- a/compiler/optimizing/dead_code_elimination.cc +++ b/compiler/optimizing/dead_code_elimination.cc @@ -488,7 +488,8 @@ void HDeadCodeElimination::MaybeAddPhi(HBasicBlock* block) { if (block_cond->GetLeft() != dominator_cond->GetLeft() || block_cond->GetRight() != dominator_cond->GetRight() || - block_cond->GetOppositeCondition() != dominator_cond->GetCondition()) { + block_cond->GetOppositeCondition() != dominator_cond->GetCondition() || + block_cond->GetBias() != dominator_cond->GetBias()) { return; } } diff --git a/test/2255-checker-branch-redirection/src/Main.java b/test/2255-checker-branch-redirection/src/Main.java index bfc6381942..a2c04ef6e0 100644 --- a/test/2255-checker-branch-redirection/src/Main.java +++ b/test/2255-checker-branch-redirection/src/Main.java @@ -32,6 +32,15 @@ public class Main { assertEquals(30, $noinline$testEliminateIfParameterOppositeCondition(20, 10, 20 < 10)); assertEquals(40, $noinline$testEliminateIfParameterOppositeCondition_2(20, 40, 20 < 40)); assertEquals(30, $noinline$testEliminateIfParameterOppositeCondition_2(20, 10, 20 < 10)); + + assertEquals(2, $noinline$testEliminateIfFp(20.0, 40.0)); + assertEquals(3, $noinline$testEliminateIfFp(20.0, 10.0)); + assertEquals(3, $noinline$testEliminateIfFp(20.0, Double.NaN)); + assertEquals(3, $noinline$testEliminateIfFp(Double.NaN, 10.0)); + assertEquals(3, $noinline$testDoNotEliminateIfOppositeCondFpWrongBias(20.0, 40.0)); + assertEquals(2, $noinline$testDoNotEliminateIfOppositeCondFpWrongBias(20.0, 10.0)); + assertEquals(3, $noinline$testDoNotEliminateIfOppositeCondFpWrongBias(20.0, Double.NaN)); + assertEquals(3, $noinline$testDoNotEliminateIfOppositeCondFpWrongBias(Double.NaN, 10.0)); } private static int $noinline$emptyMethod(int a) { @@ -274,6 +283,50 @@ public class Main { return result; } + /// CHECK-START: int Main.$noinline$testEliminateIfFp(double, double) dead_code_elimination$after_gvn (before) + /// CHECK: If + /// CHECK: If + + /// CHECK-START: int Main.$noinline$testEliminateIfFp(double, double) dead_code_elimination$after_gvn (after) + /// CHECK: If + /// CHECK-NOT: If + private static int $noinline$testEliminateIfFp(double a, double b) { + int result = 0; + if (a < b) { + $noinline$emptyMethod(0); + } else { + $noinline$emptyMethod(1); + } + if (a < b) { + result += $noinline$emptyMethod(2); + } else { + result += $noinline$emptyMethod(3); + } + return result; + } + + /// CHECK-START: int Main.$noinline$testDoNotEliminateIfOppositeCondFpWrongBias(double, double) dead_code_elimination$initial (before) + /// CHECK: If + /// CHECK: If + + /// CHECK-START: int Main.$noinline$testDoNotEliminateIfOppositeCondFpWrongBias(double, double) dead_code_elimination$initial (after) + /// CHECK: If + /// CHECK: If + private static int $noinline$testDoNotEliminateIfOppositeCondFpWrongBias(double a, double b) { + int result = 0; + if (a < b) { + $noinline$emptyMethod(0); + } else { + $noinline$emptyMethod(1); + } + if (a >= b) { + result += $noinline$emptyMethod(2); + } else { + result += $noinline$emptyMethod(3); + } + return result; + } + public static void assertEquals(int expected, int result) { if (expected != result) { throw new Error("Expected: " + expected + ", found: " + result); |