summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Vladimir Marko <vmarko@google.com> 2025-01-28 16:39:48 +0000
committer VladimĂ­r Marko <vmarko@google.com> 2025-01-29 04:53:29 -0800
commit465a50fce239660baeec54dee8572621cbd0c79b (patch)
tree69e115e49424851efa08900d5a189b78056c191b
parent72345a79d5def4b05419cadf0bbcd98bf9265346 (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.cc3
-rw-r--r--test/2255-checker-branch-redirection/src/Main.java53
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);