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.