[gcc r17-3501] tree-optimization/126965 - limit recursive PRE expression generation

Richard Biener via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:dfd857530e0bda541d4112c5c19bda0567b521ef

commit r17-3501-gdfd857530e0bda541d4112c5c19bda0567b521ef
Author: Richard Biener <[email protected]>
Date:   Fri Aug 21 09:36:27 2026 +0200

    tree-optimization/126965 - limit recursive PRE expression generation
    
    As I've recently figured the PRE value graph can have cycles so
    when recursively generating a complex expression that should be
    prone to run into those cycles as well.  PR126965 now has a testcase
    for that, so limit recursinve expression generation.
    
            PR tree-optimization/126965
            * tree-ssa-pre.cc (find_or_generate_expression): Limit
            recursion depth.
    
            * gcc.dg/tree-ssa/ssa-pre-37.c: New testcase.

Diff:
---
 gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-37.c | 109 +++++++++++++++++++++++++++++
 gcc/tree-ssa-pre.cc                        |  15 +++-
 2 files changed, 121 insertions(+), 3 deletions(-)

diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-37.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-37.c
new file mode 100644
index 000000000000..408f09a0e7d4
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-37.c
@@ -0,0 +1,109 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fgimple" } */
+
+int a[1], b;
+short c;
+unsigned short d;
+
+int __GIMPLE (ssa,guessed_local(54066899),startwith("pre"))
+main ()
+{
+  short int c_lsm_14;
+  int b_lsm_13;
+  short int _2;
+  short int _10;
+  short int _12;
+  short int _18;
+  int _22;
+  short int _24;
+  short int _27;
+  short unsigned int _28;
+  int _32;
+  unsigned short _33;
+  unsigned short _34;
+  short int _35;
+  short int _37;
+  int _38;
+  int _39;
+
+  __BB(2,guessed_local(54066900)):
+  _24 = c;
+  if (_24 != _Literal (short int) 0)
+    goto __BB3(guessed(36238787));
+  else
+    goto __BB8(guessed(97978941));
+
+  __BB(3,guessed_local(14598063)):
+  c = _Literal (short int) 0;
+  _10 = c;
+  if (_10 <= _Literal (short int) 1)
+    goto __BB9(guessed(119453778));
+  else
+    goto __BB4(guessed(14763950));
+
+  __BB(4,guessed_local(14598063)):
+  _18 = __PHI (__BB13: _2, __BB3: _10);
+  _28 = (short unsigned int) _18;
+  d = _28;
+  goto __BB8(precise(134217728));
+
+  __BB(9,guessed_local(12992276)):
+  b_lsm_13_26 = b;
+  c_lsm_14_23 = c;
+  goto __BB5(precise(134217728));
+
+  __BB(5,loop_header(4),guessed_local(118111603)):
+  _12 = __PHI (__BB11: _27, __BB9: _10);
+  b_lsm_13_41 = 1;
+  _22 = b_lsm_13_41;
+  if (_22 != 0)
+    goto __BB10(guessed(119453778));
+  else
+    goto __BB6(guessed(14763950));
+
+  __BB(6,guessed_local(118111603)):
+  b_lsm_13_31 = __PHI (__BB7: b_lsm_13_11, __BB5: b_lsm_13_41);
+  _33 = (unsigned short) _12;
+  _34 = _33 + _Literal (unsigned short) 1;
+  _35 = (short int) _34;
+  c_lsm_14_6 = _35;
+  _27 = c_lsm_14_6;
+  if (_27 <= _Literal (short int) 1)
+    goto __BB11(guessed(119453778));
+  else
+    goto __BB13(guessed(14763950));
+
+  __BB(13,guessed_local(12992276)):
+  c_lsm_14_4 = __PHI (__BB6: c_lsm_14_6);
+  _2 = __PHI (__BB6: _27);
+  b_lsm_13_3 = __PHI (__BB6: b_lsm_13_31);
+  b = b_lsm_13_3;
+  c = c_lsm_14_4;
+  goto __BB4(precise(134217728));
+
+  __BB(11,guessed_local(105119327)):
+  goto __BB5(precise(134217728));
+
+  __BB(10,guessed_local(105119327)):
+  _37 = _12 + _Literal (short int) 1;
+  _38 = (int) _37;
+  _39 = a[_38];
+  goto __BB7(precise(134217728));
+
+  __BB(7,loop_header(5),guessed_local(955630247)):
+  b_lsm_13_11 = _39;
+  _32 = b_lsm_13_11;
+  if (_32 != 0)
+    goto __BB12(guessed(119453778));
+  else
+    goto __BB6(guessed(14763950));
+
+  __BB(12,guessed_local(850510920)):
+  goto __BB7(precise(134217728));
+
+  __BB(8,guessed_local(54066899)):
+  return 0;
+
+}
+
+
diff --git a/gcc/tree-ssa-pre.cc b/gcc/tree-ssa-pre.cc
index 3f001fe47630..9353f19d4053 100644
--- a/gcc/tree-ssa-pre.cc
+++ b/gcc/tree-ssa-pre.cc
@@ -3035,7 +3035,7 @@ find_or_generate_expression (basic_block block, tree op, gimple_seq *stmts)
   gcc_assert (!value_id_constant_p (lookfor));
 
   /* It must be a complex expression, so generate it recursively.  Note
-     that this is only necessary to handle gcc.dg/tree-ssa/ssa-pre28.c
+     that this is only necessary to handle gcc.dg/tree-ssa/ssa-pre-28.c
      where the insert algorithm fails to insert a required expression.  */
   bitmap exprset = value_expressions[lookfor];
   bitmap_iterator bi;
@@ -3048,8 +3048,17 @@ find_or_generate_expression (basic_block block, tree op, gimple_seq *stmts)
 	   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));
+	  {
+	    static int depth;
+	    if (depth > 8)
+	      return NULL_TREE;
+
+	    depth++;
+	    tree res = create_expression_by_pieces (block, temp, stmts,
+						    TREE_TYPE (op));
+	    depth--;
+	    return res;
+	  }
       }
 
   /* Defer.  */
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.