mirror of
https://github.com/gentoo-mirror/gentoo.git
synced 2026-01-19 00:09:37 +03:00
sys-devel/gcc/files: cleanup old 16 patches
Signed-off-by: Sam James <sam@gentoo.org>
This commit is contained in:
@@ -1,264 +0,0 @@
|
||||
From cf82d18b90fff0e7f40f646fb22a9b95283f0a06 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <cf82d18b90fff0e7f40f646fb22a9b95283f0a06.1763579001.git.sam@gentoo.org>
|
||||
From: Dhruv Chawla <dhruvc@nvidia.com>
|
||||
Date: Wed, 19 Nov 2025 04:55:08 -0800
|
||||
Subject: [PATCH] PR tree-optimization/122733: Remove patterns for (y << x)
|
||||
{<,<=,>,>=} x
|
||||
|
||||
These patterns should not be in match.pd as they require range
|
||||
information checks that ideally belong in VRP. They were also causing
|
||||
breakages as the checks weren't tight enough.
|
||||
|
||||
Bootstrapped and regtested on aarch64-linux-gnu.
|
||||
|
||||
Signed-off-by: Dhruv Chawla <dhruvc@nvidia.com>
|
||||
|
||||
PR tree-optimization/122733
|
||||
|
||||
gcc/ChangeLog:
|
||||
|
||||
* match.pd: Remove patterns. Also call constant_boolean_node instead of
|
||||
build_one_cst and build_zero_cst and simplify equality checking
|
||||
to one pattern.
|
||||
|
||||
gcc/testsuite/ChangeLog:
|
||||
|
||||
* gcc.dg/match-shift-cmp-1.c: Update test to only check
|
||||
equality.
|
||||
* gcc.dg/match-shift-cmp-2.c: Likewise.
|
||||
* gcc.dg/match-shift-cmp-3.c: Likewise.
|
||||
* gcc.dg/match-shift-cmp-4.c: Removed.
|
||||
---
|
||||
gcc/match.pd | 32 ++-------------
|
||||
gcc/testsuite/gcc.dg/match-shift-cmp-1.c | 11 +----
|
||||
gcc/testsuite/gcc.dg/match-shift-cmp-2.c | 23 ++---------
|
||||
gcc/testsuite/gcc.dg/match-shift-cmp-3.c | 27 ++++++-------
|
||||
gcc/testsuite/gcc.dg/match-shift-cmp-4.c | 51 ------------------------
|
||||
5 files changed, 22 insertions(+), 122 deletions(-)
|
||||
delete mode 100644 gcc/testsuite/gcc.dg/match-shift-cmp-4.c
|
||||
|
||||
diff --git a/gcc/match.pd b/gcc/match.pd
|
||||
index 63d56b081925..db774eaf696c 100644
|
||||
--- a/gcc/match.pd
|
||||
+++ b/gcc/match.pd
|
||||
@@ -1339,37 +1339,13 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
|
||||
(if (INTEGRAL_TYPE_P (type))
|
||||
(rshift (op @0 @2) @1))))
|
||||
|
||||
-/* (y << x) == x -> 0 when y != 0. */
|
||||
-(simplify
|
||||
- (eq:c (nop_convert1? (lshift @0 @1)) (nop_convert2? @1))
|
||||
- (if (INTEGRAL_TYPE_P (TREE_TYPE (@1))
|
||||
- && tree_expr_nonzero_p (@0))
|
||||
- { build_zero_cst (type); }))
|
||||
-
|
||||
-/* (y << x) {<,<=} x -> 0 when y > 0. */
|
||||
-(for cmp (lt le)
|
||||
- (simplify
|
||||
- (cmp:c (nop_convert1? (lshift @0 @1)) (nop_convert2? @1))
|
||||
- (if (INTEGRAL_TYPE_P (TREE_TYPE (@1))
|
||||
- && tree_expr_nonzero_p (@0)
|
||||
- && tree_expr_nonnegative_p (@0))
|
||||
- { build_zero_cst (type); })))
|
||||
-
|
||||
-/* (y << x) != x -> 1 when y != 0. */
|
||||
-(simplify
|
||||
- (ne:c (nop_convert1? (lshift @0 @1)) (nop_convert2? @1))
|
||||
- (if (INTEGRAL_TYPE_P (TREE_TYPE (@1))
|
||||
- && tree_expr_nonzero_p (@0))
|
||||
- { build_one_cst (type); }))
|
||||
-
|
||||
-/* (y << x) {>,>=} x -> 1 when y > 0. */
|
||||
-(for cmp (gt ge)
|
||||
+/* (y << x) == x -> false and (y << x) != x -> true when y != 0. */
|
||||
+(for cmp (eq ne)
|
||||
(simplify
|
||||
(cmp:c (nop_convert1? (lshift @0 @1)) (nop_convert2? @1))
|
||||
(if (INTEGRAL_TYPE_P (TREE_TYPE (@1))
|
||||
- && tree_expr_nonzero_p (@0)
|
||||
- && tree_expr_nonnegative_p (@0))
|
||||
- { build_one_cst (type); })))
|
||||
+ && tree_expr_nonzero_p (@0))
|
||||
+ { constant_boolean_node (cmp != EQ_EXPR, type); })))
|
||||
|
||||
/* Fold (1 << (C - x)) where C = precision(type) - 1
|
||||
into ((1 << C) >> x). */
|
||||
diff --git a/gcc/testsuite/gcc.dg/match-shift-cmp-1.c b/gcc/testsuite/gcc.dg/match-shift-cmp-1.c
|
||||
index b22d57d370f1..7a69cd194376 100644
|
||||
--- a/gcc/testsuite/gcc.dg/match-shift-cmp-1.c
|
||||
+++ b/gcc/testsuite/gcc.dg/match-shift-cmp-1.c
|
||||
@@ -34,17 +34,8 @@ typedef enum
|
||||
|
||||
TEST_OP_CST (eq, ==, 1)
|
||||
TEST_OP_CST (ne, !=, 2)
|
||||
-TEST_OP_CST (lt, <, 3)
|
||||
-TEST_OP_CST (gt, >, 4)
|
||||
-TEST_OP_CST (le, <=, 5)
|
||||
-TEST_OP_CST (ge, >=, 6)
|
||||
|
||||
TEST_OP (eq, ==)
|
||||
TEST_OP (ne, !=)
|
||||
-TEST_OP (lt, <)
|
||||
-TEST_OP (gt, >)
|
||||
-TEST_OP (le, <=)
|
||||
-TEST_OP (ge, >=)
|
||||
|
||||
-/* FIXME: The lt, le, gt and ge cases for int and enum don't get optimized. */
|
||||
-/* { dg-final { scan-tree-dump-times "<<" 8 optimized } } */
|
||||
+/* { dg-final { scan-tree-dump-not "<<" optimized } } */
|
||||
diff --git a/gcc/testsuite/gcc.dg/match-shift-cmp-2.c b/gcc/testsuite/gcc.dg/match-shift-cmp-2.c
|
||||
index 96a2fd954f63..3d514ba1ee1b 100644
|
||||
--- a/gcc/testsuite/gcc.dg/match-shift-cmp-2.c
|
||||
+++ b/gcc/testsuite/gcc.dg/match-shift-cmp-2.c
|
||||
@@ -36,27 +36,12 @@ typedef enum
|
||||
|
||||
TEST_OP_CST (eq, ==, 0)
|
||||
TEST_OP_CST (ne, !=, 0)
|
||||
-TEST_OP_CST (lt, <, 0)
|
||||
-TEST_OP_CST (gt, >, 0)
|
||||
-TEST_OP_CST (le, <=, 0)
|
||||
-TEST_OP_CST (ge, >=, 0)
|
||||
|
||||
TEST_OP (eq, ==)
|
||||
TEST_OP (ne, !=)
|
||||
-TEST_OP (lt, <)
|
||||
-TEST_OP (gt, >)
|
||||
-TEST_OP (le, <=)
|
||||
-TEST_OP (ge, >=)
|
||||
|
||||
/* These end up getting folded by other patterns. */
|
||||
-/* { dg-final { scan-tree-dump-times "x_\\d\\(D\\) == 0" 8 optimized } } */
|
||||
-/* { dg-final { scan-tree-dump-times "x_\\d\\(D\\) != 0" 8 optimized } } */
|
||||
-/* { dg-final { scan-tree-dump-times "x_\\d\\(D\\) > 0" 4 optimized } } */
|
||||
-/* { dg-final { scan-tree-dump-times "x_\\d\\(D\\) < 0" 4 optimized } } */
|
||||
-/* { dg-final { scan-tree-dump-times "x_\\d\\(D\\) >= 0" 4 optimized } } */
|
||||
-/* { dg-final { scan-tree-dump-times "x_\\d\\(D\\) <= 0" 4 optimized } } */
|
||||
-/* { dg-final { scan-tree-dump-times "~x_\\d\\(D\\)" 4 optimized } } */
|
||||
-/* { dg-final { scan-tree-dump-times "return x_\\d\\(D\\);" 4 optimized } } */
|
||||
-/* { dg-final { scan-tree-dump-times "return 0;" 4 optimized } } */
|
||||
-/* { dg-final { scan-tree-dump-times "return 1;" 4 optimized } } */
|
||||
-/* Total: 48. */
|
||||
+/* { dg-final { scan-tree-dump-times "x_\\d\\(D\\) == 0" 6 optimized } } */
|
||||
+/* { dg-final { scan-tree-dump-times "x_\\d\\(D\\) != 0" 6 optimized } } */
|
||||
+/* { dg-final { scan-tree-dump-times "~x_\\d\\(D\\)" 2 optimized } } */
|
||||
+/* { dg-final { scan-tree-dump-times "return x_\\d\\(D\\);" 2 optimized } } */
|
||||
diff --git a/gcc/testsuite/gcc.dg/match-shift-cmp-3.c b/gcc/testsuite/gcc.dg/match-shift-cmp-3.c
|
||||
index 34380cfeb969..e46ac30b905f 100644
|
||||
--- a/gcc/testsuite/gcc.dg/match-shift-cmp-3.c
|
||||
+++ b/gcc/testsuite/gcc.dg/match-shift-cmp-3.c
|
||||
@@ -1,25 +1,27 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -fdump-tree-optimized" } */
|
||||
|
||||
-/* The fold (y << x) <op> x -> 0|1 shouldn't trigger when y is negative or
|
||||
- zero unsigned (except for == and !=). */
|
||||
+/* The fold (y << x) <op> x -> 0|1 should trigger when y is negative
|
||||
+ unsigned. */
|
||||
|
||||
#define TEST_ONE_CST(n, op, type, cst) \
|
||||
- bool lshift_cst_##type##_##n (type x) { return ((cst << x) op x); }
|
||||
+ bool lshift_cst_##type##_##n (type x) { return ((unsigned) (cst) << x) op x; }
|
||||
|
||||
#define TEST_OP_CST(n, op, cst) \
|
||||
+ TEST_ONE_CST (n, op, unsigned, cst) \
|
||||
TEST_ONE_CST (n, op, int, cst) \
|
||||
TEST_ONE_CST (n, op, test_enum, cst)
|
||||
|
||||
#define TEST_ONE(n, op, type) \
|
||||
bool lshift_##type##_##n (type x, type y) \
|
||||
{ \
|
||||
- if (y > 0) \
|
||||
+ if ((int) y <= 0) \
|
||||
__builtin_unreachable (); \
|
||||
- return ((y << x) op x); \
|
||||
+ return ((unsigned) (y) << x) op x; \
|
||||
}
|
||||
|
||||
#define TEST_OP(n, op) \
|
||||
+ TEST_ONE (n, op, unsigned) \
|
||||
TEST_ONE (n, op, int) \
|
||||
TEST_ONE (n, op, test_enum)
|
||||
|
||||
@@ -31,14 +33,11 @@ typedef enum
|
||||
TWO = 2
|
||||
} test_enum;
|
||||
|
||||
-TEST_OP_CST (lt, <, -1)
|
||||
-TEST_OP_CST (gt, >, -2)
|
||||
-TEST_OP_CST (le, <=, -3)
|
||||
-TEST_OP_CST (ge, >=, -4)
|
||||
+TEST_OP_CST (eq, ==, -1)
|
||||
+TEST_OP_CST (ne, !=, -2)
|
||||
|
||||
-TEST_OP (lt, <)
|
||||
-TEST_OP (gt, >)
|
||||
-TEST_OP (le, <=)
|
||||
-TEST_OP (ge, >=)
|
||||
+TEST_OP (eq, ==)
|
||||
+TEST_OP (ne, !=)
|
||||
|
||||
-/* { dg-final { scan-tree-dump-times "<<" 16 optimized } } */
|
||||
+/* { dg-final { scan-tree-dump-times "return 0;" 6 optimized } } */
|
||||
+/* { dg-final { scan-tree-dump-times "return 1;" 6 optimized } } */
|
||||
diff --git a/gcc/testsuite/gcc.dg/match-shift-cmp-4.c b/gcc/testsuite/gcc.dg/match-shift-cmp-4.c
|
||||
deleted file mode 100644
|
||||
index 629e2a376d11..000000000000
|
||||
--- a/gcc/testsuite/gcc.dg/match-shift-cmp-4.c
|
||||
+++ /dev/null
|
||||
@@ -1,51 +0,0 @@
|
||||
-/* { dg-do compile } */
|
||||
-/* { dg-options "-O2 -fdump-tree-optimized" } */
|
||||
-
|
||||
-/* The fold (y << x) <op> x -> 0|1 should trigger when y is negative
|
||||
- unsigned. */
|
||||
-
|
||||
-#define TEST_ONE_CST(n, op, type, cst) \
|
||||
- bool lshift_cst_##type##_##n (type x) { return ((unsigned) (cst) << x) op x; }
|
||||
-
|
||||
-#define TEST_OP_CST(n, op, cst) \
|
||||
- TEST_ONE_CST (n, op, unsigned, cst) \
|
||||
- TEST_ONE_CST (n, op, int, cst) \
|
||||
- TEST_ONE_CST (n, op, test_enum, cst)
|
||||
-
|
||||
-#define TEST_ONE(n, op, type) \
|
||||
- bool lshift_##type##_##n (type x, type y) \
|
||||
- { \
|
||||
- if ((int) y <= 0) \
|
||||
- __builtin_unreachable (); \
|
||||
- return ((unsigned) (y) << x) op x; \
|
||||
- }
|
||||
-
|
||||
-#define TEST_OP(n, op) \
|
||||
- TEST_ONE (n, op, unsigned) \
|
||||
- TEST_ONE (n, op, int) \
|
||||
- TEST_ONE (n, op, test_enum)
|
||||
-
|
||||
-typedef enum
|
||||
-{
|
||||
- MONE = -1,
|
||||
- ZERO = 0,
|
||||
- ONE = 1,
|
||||
- TWO = 2
|
||||
-} test_enum;
|
||||
-
|
||||
-TEST_OP_CST (eq, ==, -1)
|
||||
-TEST_OP_CST (ne, !=, -2)
|
||||
-TEST_OP_CST (lt, <, -3)
|
||||
-TEST_OP_CST (gt, >, -4)
|
||||
-TEST_OP_CST (le, <=, -5)
|
||||
-TEST_OP_CST (ge, >=, -6)
|
||||
-
|
||||
-TEST_OP (eq, ==)
|
||||
-TEST_OP (ne, !=)
|
||||
-TEST_OP (lt, <)
|
||||
-TEST_OP (gt, >)
|
||||
-TEST_OP (le, <=)
|
||||
-TEST_OP (ge, >=)
|
||||
-
|
||||
-/* { dg-final { scan-tree-dump-times "return 0;" 18 optimized } } */
|
||||
-/* { dg-final { scan-tree-dump-times "return 1;" 18 optimized } } */
|
||||
|
||||
base-commit: 00c16753875ddd9fcc9a6484717a1fc6dc95b691
|
||||
--
|
||||
2.52.0
|
||||
|
||||
@@ -1,82 +0,0 @@
|
||||
https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=00c16753875ddd9fcc9a6484717a1fc6dc95b691
|
||||
|
||||
From 00c16753875ddd9fcc9a6484717a1fc6dc95b691 Mon Sep 17 00:00:00 2001
|
||||
From: Andrew MacLeod <amacleod@redhat.com>
|
||||
Date: Wed, 19 Nov 2025 11:31:16 -0500
|
||||
Subject: [PATCH] Avoid recursion with SCEV
|
||||
|
||||
Ranger should not invoke SCEV if its already in the middle of a SCEV call.
|
||||
|
||||
PR tree-optimization/122756
|
||||
gcc/
|
||||
* gimple-range-fold.cc (range_of_ssa_name_with_loop_info): Do
|
||||
not invoke SCEV if already in a SCEV call.
|
||||
|
||||
gcc/testsuite/
|
||||
* gcc.dg/pr122756.c: New.
|
||||
---
|
||||
gcc/gimple-range-fold.cc | 15 ++++++++++++---
|
||||
gcc/testsuite/gcc.dg/pr122756.c | 15 +++++++++++++++
|
||||
2 files changed, 27 insertions(+), 3 deletions(-)
|
||||
create mode 100644 gcc/testsuite/gcc.dg/pr122756.c
|
||||
|
||||
diff --git a/gcc/gimple-range-fold.cc b/gcc/gimple-range-fold.cc
|
||||
index 63e114e4d044..bd5e53516b79 100644
|
||||
--- a/gcc/gimple-range-fold.cc
|
||||
+++ b/gcc/gimple-range-fold.cc
|
||||
@@ -1252,11 +1252,15 @@ fold_using_range::range_of_ssa_name_with_loop_info (vrange &r, tree name,
|
||||
class loop *l, gphi *phi,
|
||||
fur_source &src)
|
||||
{
|
||||
+ static bool in_scev_call = false;
|
||||
gcc_checking_assert (TREE_CODE (name) == SSA_NAME);
|
||||
+ // Avoid SCEV callbacks causing infinite recursion.
|
||||
+ if (in_scev_call)
|
||||
+ r.set_varying (TREE_TYPE (name));
|
||||
// SCEV currently invokes get_range_query () for values. If the query
|
||||
// being passed in is not the same SCEV will use, do not invoke SCEV.
|
||||
// This can be remove if/when SCEV uses a passed in range-query.
|
||||
- if (src.query () != get_range_query (cfun))
|
||||
+ else if (src.query () != get_range_query (cfun))
|
||||
{
|
||||
r.set_varying (TREE_TYPE (name));
|
||||
// Report the msmatch if SRC is not the global query. The cache
|
||||
@@ -1266,8 +1270,13 @@ fold_using_range::range_of_ssa_name_with_loop_info (vrange &r, tree name,
|
||||
fprintf (dump_file,
|
||||
"fold_using-range:: SCEV not invoked due to mismatched queries\n");
|
||||
}
|
||||
- else if (!range_of_var_in_loop (r, name, l, phi, src.query ()))
|
||||
- r.set_varying (TREE_TYPE (name));
|
||||
+ else
|
||||
+ {
|
||||
+ in_scev_call = true;
|
||||
+ if (!range_of_var_in_loop (r, name, l, phi, src.query ()))
|
||||
+ r.set_varying (TREE_TYPE (name));
|
||||
+ in_scev_call = false;
|
||||
+ }
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
diff --git a/gcc/testsuite/gcc.dg/pr122756.c b/gcc/testsuite/gcc.dg/pr122756.c
|
||||
new file mode 100644
|
||||
index 000000000000..62994696ac88
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gcc.dg/pr122756.c
|
||||
@@ -0,0 +1,15 @@
|
||||
+/* { dg-do compile } */
|
||||
+/* { dg-options "-O3" } */
|
||||
+/* { dg-additional-options "-march=rv64gcv -mabi=lp64d" { target { rv64 } } } */
|
||||
+
|
||||
+long a;
|
||||
+void b() {
|
||||
+ unsigned long c, d;
|
||||
+ for (;; c = d + 2000) {
|
||||
+ d = c;
|
||||
+ for (; d < a; d += 2)
|
||||
+ if (d % 2)
|
||||
+ for (;;)
|
||||
+ ;
|
||||
+ }
|
||||
+}
|
||||
--
|
||||
2.43.7
|
||||
Reference in New Issue
Block a user