> Minus whitespace changes it seems to be
>
> ! if (lhs_free && (is_gimple_reg (rhs) ||
> is_gimple_min_invariant (rhs)))
> rhs_free = true;
>
> vs.
>
> ! if (lhs_free
> ! && (is_gimple_reg (rhs)
> ! || !is_gimple_reg_type (TREE_TYPE (rhs))
> ! || is_gimple_min_invariant (rhs)))
> rhs_free = true;
>
> so the stmt is likely being eliminated if either the LHS or the RHS is
> based on a parameter and the other side is a register or an invariant. You
> change that to also discount aggregate stores/loads to/from parameters to
> be free.
There is also the counterpart for the RHS:
! if (rhs_free && is_gimple_reg (lhs))
lhs_free = true;
vs
! if (rhs_free
! && (is_gimple_reg (lhs)
! || !is_gimple_reg_type (TREE_TYPE (lhs))))
lhs_free = true;
> Which you could have simplified to just say
>
> if (lhs_free || rhs_free)
> return true;
>
> and drop the code you are changing.
I don't think so, compare your version and mine for scalar stores/loads
from/to parameters or return values.
--
Eric Botcazou