https://gcc.gnu.org/g:00c16753875ddd9fcc9a6484717a1fc6dc95b691

commit r16-5433-g00c16753875ddd9fcc9a6484717a1fc6dc95b691
Author: Andrew MacLeod <[email protected]>
Date:   Wed Nov 19 11:31:16 2025 -0500

    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.

Diff:
---
 gcc/gimple-range-fold.cc        | 15 ++++++++++++---
 gcc/testsuite/gcc.dg/pr122756.c | 15 +++++++++++++++
 2 files changed, 27 insertions(+), 3 deletions(-)

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 (;;)
+          ;
+  }
+}

Reply via email to