https://gcc.gnu.org/g:16e27b6d03756bf1fae22607fa93107787a7b9cb

commit r11-11421-g16e27b6d03756bf1fae22607fa93107787a7b9cb
Author: Andrew Pinski <apin...@marvell.com>
Date:   Thu Sep 7 22:13:31 2023 -0700

    Fix PR 111331: wrong code for `a > 28 ? MIN<a, 28> : 29`
    
    The problem here is after r6-7425-ga9fee7cdc3c62d0e51730,
    the comparison to see if the transformation could be done was using the
    wrong value. Instead of see if the inner was LE (for MIN and GE for MAX)
    the outer value, it was comparing the inner to the value used in the 
comparison
    which was wrong.
    
    Committed to GCC 13 branch after bootstrapped and tested on 
x86_64-linux-gnu.
    
    gcc/ChangeLog:
    
            PR tree-optimization/111331
            * tree-ssa-phiopt.c (minmax_replacement):
            Fix the LE/GE comparison for the
            `(a CMP CST1) ? max<a,CST2> : a` optimization.
    
    gcc/testsuite/ChangeLog:
    
            PR tree-optimization/111331
            * gcc.c-torture/execute/pr111331-1.c: New test.
            * gcc.c-torture/execute/pr111331-2.c: New test.
            * gcc.c-torture/execute/pr111331-3.c: New test.
    
    (cherry picked from commit 30e6ee074588bacefd2dfe745b188bb20c81fe5e)

Diff:
---
 gcc/testsuite/gcc.c-torture/execute/pr111331-1.c | 17 +++++++++++++++++
 gcc/testsuite/gcc.c-torture/execute/pr111331-2.c | 19 +++++++++++++++++++
 gcc/testsuite/gcc.c-torture/execute/pr111331-3.c | 15 +++++++++++++++
 gcc/tree-ssa-phiopt.c                            |  8 ++++----
 4 files changed, 55 insertions(+), 4 deletions(-)

diff --git a/gcc/testsuite/gcc.c-torture/execute/pr111331-1.c 
b/gcc/testsuite/gcc.c-torture/execute/pr111331-1.c
new file mode 100644
index 000000000000..4c7f4fdbaa9d
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr111331-1.c
@@ -0,0 +1,17 @@
+int a;
+int b;
+int c(int d, int e, int f) {
+  if (d < e)
+    return e;
+  if (d > f)
+    return f;
+  return d;
+}
+int main() {
+  int g = -1;
+  a = c(b + 30, 29, g + 29);
+  volatile t = a;
+  if (t != 28)
+    __builtin_abort();
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr111331-2.c 
b/gcc/testsuite/gcc.c-torture/execute/pr111331-2.c
new file mode 100644
index 000000000000..5c677f2caa9f
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr111331-2.c
@@ -0,0 +1,19 @@
+
+int a;
+int b;
+
+int main() {
+  int d = b+30;
+  {
+        int t;
+        if (d < 29)
+          t =  29;
+        else
+          t = (d > 28) ? 28 : d;
+    a = t;
+  }
+  volatile int t = a;
+  if (a != 28)
+    __builtin_abort();
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr111331-3.c 
b/gcc/testsuite/gcc.c-torture/execute/pr111331-3.c
new file mode 100644
index 000000000000..213d9bdd539d
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr111331-3.c
@@ -0,0 +1,15 @@
+int a;
+int b;
+
+int main() {
+  int d = b+30;
+  {
+    int t;
+    t = d < 29 ? 29 : ((d > 28) ? 28 : d);
+    a = t;
+  }
+  volatile int t = a;
+  if (a != 28)
+    __builtin_abort();
+  return 0;
+}
diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c
index 5831a7764a49..d26d7889d952 100644
--- a/gcc/tree-ssa-phiopt.c
+++ b/gcc/tree-ssa-phiopt.c
@@ -1676,7 +1676,7 @@ minmax_replacement (basic_block cond_bb, basic_block 
middle_bb,
 
              /* We need BOUND <= LARGER.  */
              if (!integer_nonzerop (fold_build2 (LE_EXPR, boolean_type_node,
-                                                 bound, larger)))
+                                                 bound, arg_false)))
                return false;
            }
          else if (operand_equal_for_phi_arg_p (arg_false, smaller)
@@ -1707,7 +1707,7 @@ minmax_replacement (basic_block cond_bb, basic_block 
middle_bb,
 
              /* We need BOUND >= SMALLER.  */
              if (!integer_nonzerop (fold_build2 (GE_EXPR, boolean_type_node,
-                                                 bound, smaller)))
+                                                 bound, arg_false)))
                return false;
            }
          else
@@ -1747,7 +1747,7 @@ minmax_replacement (basic_block cond_bb, basic_block 
middle_bb,
 
              /* We need BOUND >= LARGER.  */
              if (!integer_nonzerop (fold_build2 (GE_EXPR, boolean_type_node,
-                                                 bound, larger)))
+                                                 bound, arg_true)))
                return false;
            }
          else if (operand_equal_for_phi_arg_p (arg_true, smaller)
@@ -1774,7 +1774,7 @@ minmax_replacement (basic_block cond_bb, basic_block 
middle_bb,
 
              /* We need BOUND <= SMALLER.  */
              if (!integer_nonzerop (fold_build2 (LE_EXPR, boolean_type_node,
-                                                 bound, smaller)))
+                                                 bound, arg_true)))
                return false;
            }
          else

Reply via email to