Ajit Agarwal <aagar...@linux.ibm.com> writes:
> [...]
>>> +// Set subreg for OO mode pair to generate sequential registers given
>>> +// insn_info pairs I1, I2 and LOAD_P is true iff load insn and false
>>> +// if store insn.
>>> +void
>>> +rs6000_pair_fusion::set_multiword_subreg (insn_info *i1, insn_info *i2,
>>> +                                     bool load_p)
>>> +{
>>> +  if (load_p)
>>> +    {
>>> +      bool i1_subreg_p = use_has_subreg_p (i1);
>>> +      bool i2_subreg_p = use_has_subreg_p (i2);
>>> +
>>> +      if (i1_subreg_p || i2_subreg_p)
>>> +   set_multiword_existing_subreg (i1, i2);
>>> +      else
>>> +   set_multiword_subreg_load (i1, i2);
>> 
>> I don't understand this.  Why do we have both set_multiword_existing_subreg
>> and set_multiword_subreg_load?  i1_subreg_p and i2_subreg_p are logically
>> independent of one another (since i1 and i2 were separate instructions
>> until now).  So "i1_subreg_p || i2_subreg_p" implies that
>> set_multiword_existing_subreg can handle i1s that have no existing
>> subreg (used when i2_subreg_p) and that it can handle i2s that have no
>> existing subreg (used when i1_subreg_p).  So doesn't this mean that
>> set_multiword_existing_subreg can handle everything?
>> 
>
> I will make the following change.
>  if (load_p)
>     {
>       bool i1_subreg_p = use_has_subreg_p (i1);
>       bool i2_subreg_p = use_has_subreg_p (i2);
>
>       if (!i1_subreg_p && !i2_subreg_p) 
>         set_multiword_subreg_load (i1, i2);
>       else
>         set_multiword_existing_subreg (i1, i2);
>     }
>
> Is this okay.

That's the same thing though: it's just replacing a ? A : B with !a ? B : A.

>> IMO, the way the update should work is that:
>> 
>> (a) all references to the old registers should be updated via
>>     insn_propagation (regardless of whether the old references
>>     involved subregs).
>> 
>> (b) those updates should be part of the same insn_change group as
>>     the change to the load itself.
>> 
>> For stores, definitions of the stored register can probably be handled
>> directly using df_refs, but there too, the updates should IMO be part
>> of the same insn_change group as the change to the store itself.
>> 
>> In both cases, it's the:
>> 
>>   crtl->ssa->change_insns (changes);
>> 
>> in pair_fusion_bb_info::fuse_pair that should be responsible for
>> updating the rtl-ssa IR.  The changes that the pass wants to make
>> should be described as insn_changes and passed to change_insns.
>> 
>> The reason for funneling all changes through change_insns is that
>> it allows rtl-ssa to maintain more complex datastructures.  Clients
>> aren't supposed to manually update the datastructures piecemeal.
>> 
>
> I am afraid I am not getting this. Would you mind elaborating this.
> Sorry for that.

See how fwprop.cc makes changes.  It:

- creates an insn_change for each change that it wants to make

- uses insn_propagation to replace the old value with the new value

- sets the new_uses of the insn_change to reflect the effect
  of the propagation (in this case, replacing the old 128-bit
  value with a 256-bit value)

- uses change_insn to commit the change

The process would be similar here.

Thanks,
Richard

Reply via email to