https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126150
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
gcc_assert (var->ssa_name.fast_iteration_depth == 0
&& (var->ssa_name.active_iterated_stmt == NULL
|| (var->ssa_name.active_iterated_stmt
== linknode->loc.stmt)));
(gdb) p var->ssa_name.active_iterated_stmt
$2 = <gimple_assign 0x7ffff660e370>
(gdb) p linknode->loc.stmt
$3 = <gimple_cond 0x7ffff69f86e0>
(gdb) p var
$6 = <ssa_name 0x7ffff69f8f78 7>
(gdb) p debug_gimple_stmt ($3)
if (_7 == _14)
$4 = void
(gdb) p debug_gimple_stmt ($2)
# .MEM_16 = VDEF <.MEM_24>
MEM[(struct B *)&w3].t = 0;
looks ike active_iterated_stmt is stale (update_stmt missing?)
In the end it's replace_uses_by doing
if (maybe_clean_or_replace_eh_stmt (orig_stmt, stmt))
gimple_purge_dead_eh_edges (gimple_bb (stmt));
under FOR_EACH_IMM_USE_STMT that's problematic. Fixing.