aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--15.0.0/gentoo/73_all_PR117646-match-Fix-the-max-a-b-0-pattern-for-pointers.patch83
-rw-r--r--15.0.0/gentoo/README.history4
2 files changed, 87 insertions, 0 deletions
diff --git a/15.0.0/gentoo/73_all_PR117646-match-Fix-the-max-a-b-0-pattern-for-pointers.patch b/15.0.0/gentoo/73_all_PR117646-match-Fix-the-max-a-b-0-pattern-for-pointers.patch
new file mode 100644
index 0000000..c0ab935
--- /dev/null
+++ b/15.0.0/gentoo/73_all_PR117646-match-Fix-the-max-a-b-0-pattern-for-pointers.patch
@@ -0,0 +1,83 @@
+From 45a3277149d95a51cf9109cab87ee39a7dce73e2 Mon Sep 17 00:00:00 2001
+Message-ID: <45a3277149d95a51cf9109cab87ee39a7dce73e2.1731926298.git.sam@gentoo.org>
+From: Andrew Pinski <quic_apinski@quicinc.com>
+Date: Sun, 17 Nov 2024 20:21:58 -0800
+Subject: [PATCH] match: Fix the `max<a,b>==0` pattern for pointers [PR117646]
+
+For pointers I forgot that BIT_IOR_EXPR is not valid so when
+I added the pattern to convert `max<a,b> != 0` (r15-5356), GCC
+would start to ICEing saying pointer types were not valid for
+BIT_IOR_EXPR.
+This fixes the problem by casting to the unsigned type of the
+inner type. There was another way of fixing this to handling it
+as `a == 0 & b == 0` but both match and reassoication (for pointers)
+will then convert it back into the form I am creating here so
+let's just use that form instead.
+
+Bootstrapped and tested on x86_64-linux-gnu.
+
+ PR tree-optimization/117646
+
+gcc/ChangeLog:
+
+ * match.pd (`max<a,b>==0`): Add casts to `unsigned type`.
+
+gcc/testsuite/ChangeLog:
+
+ * gcc.dg/torture/minmaxneeqptr-1.c: New test.
+
+Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
+---
+ gcc/match.pd | 6 ++++--
+ .../gcc.dg/torture/minmaxneeqptr-1.c | 21 +++++++++++++++++++
+ 2 files changed, 25 insertions(+), 2 deletions(-)
+ create mode 100644 gcc/testsuite/gcc.dg/torture/minmaxneeqptr-1.c
+
+diff --git a/gcc/match.pd b/gcc/match.pd
+index 4bec24a21b29..f5181325f3b9 100644
+--- a/gcc/match.pd
++++ b/gcc/match.pd
+@@ -4799,9 +4799,11 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
+ MAX (A, B) != 0 -> (A|B) != 0 iff unsigned. */
+ (for cmp (eq ne)
+ (simplify
+- (cmp (max @0 @1) integer_zerop@2)
++ (cmp (max @0 @1) integer_zerop)
+ (if (TYPE_UNSIGNED (TREE_TYPE (@0)))
+- (cmp (bit_ior @0 @1) @2))))
++ (with { tree utype = unsigned_type_for (TREE_TYPE (@0)); }
++ (cmp (bit_ior (convert:utype @0) (convert:utype @1))
++ { build_zero_cst (utype); } )))))
+
+ /* Undo fancy ways of writing max/min or other ?: expressions, like
+ a - ((a - b) & -(a < b)) and a - (a - b) * (a < b) into (a < b) ? b : a.
+diff --git a/gcc/testsuite/gcc.dg/torture/minmaxneeqptr-1.c b/gcc/testsuite/gcc.dg/torture/minmaxneeqptr-1.c
+new file mode 100644
+index 000000000000..aa45722330f4
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/torture/minmaxneeqptr-1.c
+@@ -0,0 +1,21 @@
++/* { dg-do compile } */
++
++/* PR tree-optimization/117646 */
++
++int maxeq(char *a, char *b) {
++ char *p = a < b ? b : a;
++ return p == (void*)0;
++}
++int maxne(char *a, char *b) {
++ char *p = a < b ? b : a;
++ return p == (void*)0;
++}
++
++int mineq(char *a, char *b) {
++ char *p = a > b ? b : a;
++ return p == (void*)0;
++}
++int minne(char *a, char *b) {
++ char *p = a > b ? b : a;
++ return p == (void*)0;
++}
+--
+2.47.0
+
diff --git a/15.0.0/gentoo/README.history b/15.0.0/gentoo/README.history
index af598af..df484a6 100644
--- a/15.0.0/gentoo/README.history
+++ b/15.0.0/gentoo/README.history
@@ -1,3 +1,7 @@
+26 18 November 2024
+
+ + 73_all_PR117646-match-Fix-the-max-a-b-0-pattern-for-pointers.patch
+
25 18 November 2024
+ 72_all_PR117628-libgcc-c23.patch