https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82991
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> --- Found it (old tree): Index: tree-ssa-sccvn.c =================================================================== --- tree-ssa-sccvn.c (revision 254072) +++ tree-ssa-sccvn.c (working copy) @@ -4123,6 +4234,25 @@ visit_use (tree use) changed = defs_to_varying (call_stmt); goto done; } + + int rflags = gimple_call_return_flags (call_stmt); + if (rflags & ERF_RETURNS_ARG) + { + unsigned argnum = rflags & ERF_RETURN_ARG_MASK; + if (argnum < gimple_call_num_args (call_stmt)) + { + tree arg = gimple_call_arg (call_stmt, argnum); + if (TREE_CODE (arg) == SSA_NAME + /*|| is_gimple_min_invariant (arg)*/) + { + changed = visit_copy (lhs, arg); + if (gimple_vdef (call_stmt)) + changed |= set_ssa_val_to (gimple_vdef (call_stmt), + gimple_vdef (call_stmt)); + goto done; + } + } + } } /* Pick up flags from a devirtualization target. */ Index: tree-ssa-pre.c =================================================================== --- tree-ssa-pre.c (revision 254072) +++ tree-ssa-pre.c (working copy) @@ -4309,6 +4369,14 @@ eliminate_dom_walker::before_dom_childre eliminate_push_avail (sprime); } + /* While we might have value numbered a call return value to + one of its arguments the call itself might not be solely + represented by its return value. Thus do not ignore + side-effects indicated by a VARYING vdef. */ + if (gimple_vdef (stmt) + && VN_INFO (gimple_vdef (stmt))->valnum == gimple_vdef (stmt)) + sprime = NULL_TREE; + /* If this now constitutes a copy duplicate points-to and range info appropriately. This is especially important for inserted code. See tree-ssa-copy.c