https://gcc.gnu.org/g:aa28a331e9f7c526540184d4b748198b8e5ad338

commit r15-10000-gaa28a331e9f7c526540184d4b748198b8e5ad338
Author: Richard Biener <rguent...@suse.de>
Date:   Wed Jul 16 20:19:44 2025 +0200

    tree-optimization/121035 - handle stray VN values without expression
    
    When VN iterates we can end up with unreachable inserted expressions
    in the expression tables which in turn will not be added to their
    value by PREs compute_avail.  This will later ICE when we pick
    them up and want to generate them.  Deal with this by giving up.
    
            PR tree-optimization/121035
            * tree-ssa-pre.cc (find_or_generate_expression): Handle
            values without expression.
    
            * gcc.dg/pr121035.c: New testcase.
    
    (cherry picked from commit 9af57c471087a3a1b87621bce1208d6c77ba2a4a)

Diff:
---
 gcc/testsuite/gcc.dg/pr121035.c | 94 +++++++++++++++++++++++++++++++++++++++++
 gcc/tree-ssa-pre.cc             | 21 ++++-----
 2 files changed, 105 insertions(+), 10 deletions(-)

diff --git a/gcc/testsuite/gcc.dg/pr121035.c b/gcc/testsuite/gcc.dg/pr121035.c
new file mode 100644
index 000000000000..fc0edce5d7d3
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr121035.c
@@ -0,0 +1,94 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fgimple" } */
+
+int printf(const char *, ...);
+int a, b, d;
+unsigned c;
+int __GIMPLE (ssa,startwith("pre"))
+main ()
+{
+  unsigned int g;
+  int f;
+  unsigned int _1;
+  unsigned int _2;
+  int _3;
+  int _4;
+  int _5;
+  unsigned int _6;
+  unsigned int _7;
+  int _10;
+  unsigned int _11;
+  _Bool _19;
+  _Bool _20;
+  _Bool _22;
+  int _25;
+
+  __BB(2):
+  _25 = a;
+  if (_25 != 0)
+    goto __BB11;
+  else
+    goto __BB10;
+
+  __BB(11):
+  goto __BB3;
+
+  __BB(3):
+  f_26 = __PHI (__BB12: f_18, __BB11: 0);
+  g_15 = c;
+  if (f_26 != 0)
+    goto __BB4;
+  else
+    goto __BB5;
+
+  __BB(4):
+  __builtin_putchar (48);
+  goto __BB5;
+
+  __BB(5):
+  _1 = c;
+  _2 = _1 << 1;
+  _3 = a;
+  _4 = d;
+  _5 = _3 * _4;
+  if (_5 != 0)
+    goto __BB7;
+  else
+    goto __BB6;
+
+  __BB(6):
+  goto __BB7;
+
+  __BB(7):
+  _11 = __PHI (__BB5: 0u, __BB6: 4294967295u);
+  _6 = g_15 * 4294967294u;
+  _7 = _6 | _11;
+  _20 = _3 != 0;
+  _19 = _7 != 0u;
+  _22 = _19 & _20;
+  if (_22 != _Literal (_Bool) 0)
+    goto __BB9;
+  else
+    goto __BB8;
+
+  __BB(8):
+  goto __BB9;
+
+  __BB(9):
+  _10 = __PHI (__BB7: 1, __BB8: 0);
+  b = _10;
+  f_18 = (int) _1;
+  if (_3 != 0)
+    goto __BB12;
+  else
+    goto __BB10;
+
+  __BB(12):
+  goto __BB3;
+
+  __BB(10):
+  return 0;
+
+}
+
+
diff --git a/gcc/tree-ssa-pre.cc b/gcc/tree-ssa-pre.cc
index ecf45d29e769..be94b60bad8d 100644
--- a/gcc/tree-ssa-pre.cc
+++ b/gcc/tree-ssa-pre.cc
@@ -2773,16 +2773,17 @@ find_or_generate_expression (basic_block block, tree 
op, gimple_seq *stmts)
   bitmap exprset = value_expressions[lookfor];
   bitmap_iterator bi;
   unsigned int i;
-  EXECUTE_IF_SET_IN_BITMAP (exprset, 0, i, bi)
-    {
-      pre_expr temp = expression_for_id (i);
-      /* We cannot insert random REFERENCE expressions at arbitrary
-        places.  We can insert NARYs which eventually re-materializes
-        its operand values.  */
-      if (temp->kind == NARY)
-       return create_expression_by_pieces (block, temp, stmts,
-                                           TREE_TYPE (op));
-    }
+  if (exprset)
+    EXECUTE_IF_SET_IN_BITMAP (exprset, 0, i, bi)
+      {
+       pre_expr temp = expression_for_id (i);
+       /* We cannot insert random REFERENCE expressions at arbitrary
+          places.  We can insert NARYs which eventually re-materializes
+          its operand values.  */
+       if (temp->kind == NARY)
+         return create_expression_by_pieces (block, temp, stmts,
+                                             TREE_TYPE (op));
+      }
 
   /* Defer.  */
   return NULL_TREE;

Reply via email to