https://gcc.gnu.org/bugzilla/show_bug.cgi?id=123994

--- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
(In reply to Andrew Pinski from comment #3)
> 113             while (min_insn != change->insn () && !can_insert_after
> (min_insn))
> 114               min_insn = min_insn->next_nondebug_insn ();
> 
> 
> 
> (gdb) p min_insn
> $2 = (rtl_ssa::insn_info *) 0x0

We are going to the end here.

This fixes the issue; I think it is correct:
```
[apinski@xeond2 gcc]$ git diff
diff --git a/gcc/rtl-ssa/changes.cc b/gcc/rtl-ssa/changes.cc
index e0df982880c..184083d7ed7 100644
--- a/gcc/rtl-ssa/changes.cc
+++ b/gcc/rtl-ssa/changes.cc
@@ -110,7 +110,13 @@ function_info::verify_insn_changes
(array_slice<insn_change *const> changes)
        // Make sure that the changes can be kept in their current order
        // while honoring all of the move ranges.
        min_insn = later_insn (min_insn, change->move_range.first);
-       while (min_insn != change->insn () && !can_insert_after (min_insn))
+       if (*min_insn > *change->move_range.last)
+         {
+           if (dump_file && (dump_flags & TDF_DETAILS))
+             fprintf (dump_file, "no viable insn position assignment\n");
+           return false;
+         }
+       while (min_insn && min_insn != change->insn () && !can_insert_after
(min_insn))
          min_insn = min_insn->next_nondebug_insn ();
        if (*min_insn > *change->move_range.last)
          {
```

What is happening is the min_insn is already past `change->insn
()`/`change->move_range.last` I have not looked into why though.

Reply via email to