[gcc r17-3363] tree-optimization/126925 - missed folding causes IVOPTs crash

Richard Biener rguenth@gcc.gnu.org
Tue Aug 18 11:52:12 GMT 2026


https://gcc.gnu.org/g:8ff8114e4448307f27e38fbdb98028283ab64f1c

commit r17-3363-g8ff8114e4448307f27e38fbdb98028283ab64f1c
Author: Richard Biener <rguenther@suse.de>
Date:   Tue Aug 18 09:49:12 2026 +0200

    tree-optimization/126925 - missed folding causes IVOPTs crash
    
    When we fail to simplify an IV candidate step to zero SCEV might
    still have simplified the before/after candidate to an IV with
    zero step.  Avoid crashing in such situation.
    
            PR tree-optimization/126925
            * tree-ssa-loop-ivopts.cc (create_new_iv): Avoid crashing
            if the use IV is invariant.
    
            * gcc.dg/torture/pr126925.c: New testcase.

Diff:
---
 gcc/testsuite/gcc.dg/torture/pr126925.c | 21 +++++++++++++++++++++
 gcc/tree-ssa-loop-ivopts.cc             | 11 ++++++++---
 2 files changed, 29 insertions(+), 3 deletions(-)

diff --git a/gcc/testsuite/gcc.dg/torture/pr126925.c b/gcc/testsuite/gcc.dg/torture/pr126925.c
new file mode 100644
index 000000000000..06e601d64985
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr126925.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+
+int a;
+long b;
+int c(long d) {
+  for (;;)
+    if (d)
+      return b;
+}
+void e(int d) {
+  unsigned long f = 6;
+  int g;
+  while (c(f)) {
+    g = 0;
+    for (; g < 2; g++) {
+      a = 0;
+      short h = d;
+      f = d + f - (h + f + (a + 4 + f));
+    }
+  }
+}
diff --git a/gcc/tree-ssa-loop-ivopts.cc b/gcc/tree-ssa-loop-ivopts.cc
index 3c0ce1794c2f..963e89e4b3c2 100644
--- a/gcc/tree-ssa-loop-ivopts.cc
+++ b/gcc/tree-ssa-loop-ivopts.cc
@@ -7257,10 +7257,15 @@ create_new_iv (struct ivopts_data *data, struct iv_cand *cand)
       name_info (data, cand->var_before)->preserve_biv = true;
       name_info (data, cand->var_after)->preserve_biv = true;
 
-      /* Rewrite the increment so that it uses var_before directly.  */
+      /* Rewrite the increment so that it uses var_before directly.  Missed
+	 optimization can result in a use IV with zero step, avoid
+	 crashing in that case.  */
       use = find_interesting_uses_op (data, cand->var_after);
-      group = data->vgroups[use->group_id];
-      group->selected = cand;
+      if (use)
+	{
+	  group = data->vgroups[use->group_id];
+	  group->selected = cand;
+	}
       return;
     }


More information about the Gcc-cvs mailing list