r17-265-gf6f33ca83cb6b8 added a new pattern that converts:
cond ? (A | CST1) : (A & ~CST1)
into `(A & ~CST1) | (cond * CST1)` but fold (partly via
fold_binary_op_with_conditional_arg) will turn
that back into `cond ? (A | CST1) : (A & ~CST1)` in some
cases. In those cases we get an infinite loop and a stack overflow crash.
This fixes the problem by enabling this pattern for GIMPLE only.
Pushed as obvious after bootstrap/test on x86_64-linux-gnu.
PR middle-end/125588
gcc/ChangeLog:
* match.pd (`if (cond) (A | CST1) : (A & ~CST1)`): Enable
for GIMPLE only.
gcc/testsuite/ChangeLog:
* gcc.dg/pr125588-1.c: New test.
Signed-off-by: Andrew Pinski <[email protected]>
---
gcc/match.pd | 2 ++
gcc/testsuite/gcc.dg/pr125588-1.c | 9 +++++++++
2 files changed, 11 insertions(+)
create mode 100644 gcc/testsuite/gcc.dg/pr125588-1.c
diff --git a/gcc/match.pd b/gcc/match.pd
index 45ffe39604e..6b70999fab5 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -6314,6 +6314,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
&& INTEGRAL_TYPE_P (TREE_TYPE (@0)))
(cond @1 (convert @2) (convert @3))))
+#if GIMPLE
/* PR123967: if (cond) A | CST1 : A & ~CST1
Make both bitops unconditional: (A & ~CST1) | (cond * CST1). */
@@ -6326,6 +6327,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
&& TYPE_PRECISION (type) <= BITS_PER_WORD
&& wi::to_wide (@1) == ~wi::to_wide (@2))
(bit_ior @3 (mult (convert:type @4) (convert:type @1))))))
+#endif
/* Simplification moved from fold_cond_expr_with_comparison. It may also
be extended. */
diff --git a/gcc/testsuite/gcc.dg/pr125588-1.c
b/gcc/testsuite/gcc.dg/pr125588-1.c
new file mode 100644
index 00000000000..d5763e9d8a6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr125588-1.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-w" } */
+/* PR middle-end/125588 */
+void f() {
+unsigned short a = 8 <= 0 % 0 |
+ 7 >> (6 >> 48) % 1 ^
+ 6 >> 8 <= 0 &
+ 7 >> (6 >> 48) % 1;
+}
--
2.43.0