Hi Richard,

Thanks for the review.
Please find attached updated patch after your review comments.

Changelog:
gcc/
        * config/mips/mips.md (JOIN_MODE): New mode iterator.
        (join2_load_Store<JOIN_MODE:mode>): New pattern.
        (join2_loadhi): Likewise.
        (define_peehole2): Add peephole2 patterns to join 2 HI/SI/SF/DF-mode
        load-load and store-stores.
        * config/mips/mips.opt (mload-store-pairs): New option.
        (TARGET_LOAD_STORE_PAIRS): New macro.
        *config/mips/mips.h (ENABLE_P5600_LD_ST_PAIRS): Likewise.
        *config/mips/mips-protos.h (mips_load_store_bonding_p): New prototype.
        *config/mips/mips.c(mips_load_store_bonding_p): New function.

The change is tested with dejagnu with additional options -mload-store-pairs 
and -mtune=p5600.
The perf measurement is yet to finish.

> > We had offline discussion based on your comment. There is additional
> > view on the same.
> > Only ISAs mips32r2, mips32r3 and mips32r5 support P5600. Remaining
> > ISAs do not support P5600.
> > For mips32r2 (24K) and mips32r3 (micromips), load-store pairing is
> > implemented separately, and hence, as you suggested, P5600 Ld-ST
> > bonding optimization should not be enabled for them.
> > So, is it fine if I emit error for any ISAs other than mips32r2,
> > mips32r3 and mips32r5 when P5600 is enabled, or the compilation should
> > continue by emitting warning and disabling P5600?
> 
> No, the point is that we have two separate concepts: ISA and optimisation
> target.  -mipsN and -march=N control the ISA (which instructions are
> available) and -mtune=M controls optimisation decisions within the
> constraints of that N, such as scheduling and the cost of things like
> multiplication and division.
> 
> E.g. you could have -mips2 -mtune=p5600 -mfix-24k: generate MIPS II-
> compatible code, optimise it for p5600, but make sure that 24k workarounds
> are used.  The code would run correctly on any MIPS II-compatible processor
> without known errata and also on the 24k.
Ok, disabled the peephole pattern for fix-24k and micromips - to allow specific 
patterns to be matched.

> > +
> > +mld-st-pairing
> > +Target Report Var(TARGET_ENABLE_LD_ST_PAIRING) Enable load/store
> > +pairing
> 
> Other options are just "TARGET_" + the captialised form of the option name,
> so I'd prefer TARGET_LD_ST_PAIRING instead.  Although "ld" might be
> misleading since it's an abbreviation for "load" rather than the LD 
> instruction.
> Maybe -mload-store-pairs, since plurals are more common than "-ing"?
> Not sure that's a great suggestion though.
Renamed the option and corresponding macro as suggested.

> > Performance testing for this patch is not yet done.
> > If the patch proves beneficial in most of the testcases (which we
> > believe will do on P5600) we will enable this optimization by default
> > for P5600 - in which case this option can be removed.
> 
> OK.  Sending the patch for comments before performance testing is fine, but
> I think it'd be better to commit the patch only after the testing is done, 
> since
> otherwise the patch might need to be tweaked.
> 
> I don't see any problem with keeping the option in case people want to
> experiment with it.  I just think the patch should only go in once it can be
> enabled by default for p5600.  I.e. the option would exist to turn off the
> pairing.
> 
> Not having the option is fine too of course.
Yes, after perf analysis, I will share the results across, and then depending 
upon the impact, the decision can be made - whether to make the option as 
default or not, and then the patch will be submitted.

> We should allow pairing even without -mtune=p5600.
The load-store pairing is currently attribute of P5600, so I have not enabled 
the pairing without mtune=5600. If need be, can enable that without mtune=p5600.

> 
> (define_mode_iterator JOIN_MODE [
>   SI
>   (DI "TARGET_64BIT")
>   (SF "TARGET_HARD_FLOAT")
>   (DF "TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT")])
>
Done this change.
 
> and then extend:
> 
> > @@ -883,6 +884,8 @@
> >  (define_mode_attr loadx [(SF "lwxc1") (DF "ldxc1") (V2SF "ldxc1")])
> > (define_mode_attr storex [(SF "swxc1") (DF "sdxc1") (V2SF "sdxc1")])
> >
> > +(define_mode_attr insn_type [(SI "") (SF "fp") (DF "fp")])
> > +
> >  ;; The unextended ranges of the MIPS16 addiu and daddiu instructions
> > ;; are different.  Some forms of unextended addiu have an 8-bit
> > immediate  ;; field but the equivalent daddiu has only a 5-bit field.
> 
> this accordingly.
In order to allow d/f for both register classes, the pattern 
join2_load_store<mode> was altered a bit which eliminated this mode iterator.

> 
> Outer (parallel ...)s are redundant in a define_insn.
Removed.

> 
> It would be better to add the mips_load_store_insns for each operand
> rather than multiplying one of them by 2.  Or see the next bit for an
> alternative.
Using the alternative method as you suggested, so this change is not needed.

> Please instead add HI to the define_mode_iterator so that we can use the
> same peephole and define_insn.
Added HI in the mode iterator to eliminate join2_storehi pattern and 
corresponding peephole2.
As arithmetic operations on HImode is not supported, we generate zero or sign 
extended loads in such cases. 
To handle that case, join2_loadhi pattern is kept.

- Thanks and regards,
   Sameera D.

Attachment: load-store-pairing.patch
Description: load-store-pairing.patch

Reply via email to