https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77646
--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> ---
Ok, this is because we value-number the indirect call result to the result of
the direct call (correctly) but that has no VDEF (it's detected pure) and thus
we fail to value-number the indirect calls VDEF.
@@ -3470,6 +3577,10 @@ visit_reference_op_call (tree lhs, gcall
{
if (vnresult->result_vdef && vdef)
changed |= set_ssa_val_to (vdef, vnresult->result_vdef);
+ else if (vdef)
+ /* If the call was discovered to be pure or const reflect
+ that as far as possible. */
+ changed |= set_ssa_val_to (vdef, gimple_vuse (stmt));
if (!vnresult->result && lhs)
vnresult->result = lhs;