https://gcc.gnu.org/bugzilla/show_bug.cgi?id=123958
--- Comment #15 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
(In reply to Andrew Pinski from comment #11)
> cancel_fma_deferring does:
> gimple_stmt_iterator gsi = gsi_for_stmt (fti.mul_stmt);
> gsi_remove (&gsi, true);
> release_defs (fti.mul_stmt);
>
>
> vs what is done for pow in math_opts_dom_walker::after_dom_children:
>
> CASE_CFN_POW:
> if (gimple_call_lhs (stmt)
> && TREE_CODE (gimple_call_arg (stmt, 1)) == REAL_CST
> && real_equal (&TREE_REAL_CST (gimple_call_arg (stmt, 1)),
> &dconst2)
> && convert_mult_to_fma (stmt,
> gimple_call_arg (stmt, 0),
> gimple_call_arg (stmt, 0),
> &fma_state))
> {
> unlink_stmt_vdef (stmt);
> if (gsi_remove (&gsi, true)
> && gimple_purge_dead_eh_edges (bb))
> *m_cfg_changed_p = true;
> release_defs (stmt);
> continue;
> }
Notice the unlink_stmt_vdef there which updates the VOPs to be correct.