> In this patch, a new field is added to 'struct value_data_entry'
> which indicates if the instruction that created this
> value is frame related or not. Then during copy propagation, we do not
> replace registers if the copy is happening from a non-frame related insn
> to a frame related insn.
> 
> Bootstrapped and regtested on powerpc64le.
> 
> 2025-11-16  Surya Kumari Jangala  <[email protected]>
> 
> gcc:
>       PR rtl-optimization/122274
>       * regcprop.cc (value_data_entry): New field.
>       (kill_value_one_regno): Update field.
>       (init_value_data): Initialize field.
>       (kill_set_value_data): New field.
>       (kill_set_value): Update field.
>       (kill_autoinc_value): Likewise.
>       (copy_value): New parameter. Update field.
>       (find_oldest_value_reg): New parameter. Compare frame relatedness
>       of insn and propagated value.
>       (replace_oldest_value_reg): Pass additional parameter to
>       find_oldest_value_reg().
>       (copyprop_hardreg_forward_1): Pass additional parameter to
>       find_oldest_value_reg(). Compare frame relatedness of insn and
>       propagated value. Call copy_value() with additional parameter.

The transformation needs to be blocked in two different places, namely 
find_oldest_value_reg and copyprop_hardreg_forward_1 directly, so can you 
factor out the condition into a predicate and document in its description the 
reason why it is necessary (because dwarf2out needs to...), for example:

/* Return whether...  */

static bool
compatible_frame_status (bool to_frame_related, bool from_frame_related)
{
  return !to_frame_related || from_frame_related;
}

Otherwise this looks good to me.

-- 
Eric Botcazou


Reply via email to