Hello, Ping for the non-back-end parts of http://gcc.gnu.org/ml/gcc-patches/2012-04/msg01668.html
David approved the rs6000 parts already (with adjustments to comments, http://gcc.gnu.org/ml/gcc-patches/2012-05/msg00368.html) Thanks much in advance for your feedback, Olivier On Apr 26, 2012, at 11:30 , Olivier Hainque wrote: ... > a number of places in the compiler use the > mode_dependent_address_p predicate to actually check for weaker necesssary > conditions. Typically, a few places need to check that a MEM access remains > valid when just narrowing the mode, while mode_dependent_address_p tells if > any mode change is valid. > > While this is of course generally safe, this has been causing endless troubles > to the powerpc back-end which has apparently unique particularities related to > altivec modes. ... > The attached patch is a proposal to fix this, slightly generalized compared > to the original one. The general idea is to allow for weaker predicates at > the places where we need them. > > This is achieved by the introduction of a TARGET_MAY_NARROW_ACCESS target > hook, which defaults to !mode_dependent_address_p and is redefined for > powerpc. The patch uses this hook directly instead of the former predicate in > a couple of places where this was the intent already, as well as new > "valid_access_mode_change_p" function to direct to one or the or the other > depending on provided original and destination modes. > > This provides a better match for actual internal needs, allows to get rid of > the powerpc back-end twists (no need to lie in mode_dependent_address_p any > more) and cures the observed internal compiler error. ... > 2012-04-26 Olivier Hainque <hain...@adacore.com> > > * target.def (TARGET_MAY_NARROW_ACCESS_TO): New hook. > * doc/tm.texi[.in] (TARGET_MAY_NARROW_ACCESS_TO): Document. > * targhooks.c (default_may_narrow_access_to): Default implementation. > * targhooks.h (default_may_narrow_access_to): Declare. > * config/rs6000/rs6000.c (rs6000_may_narrow_access_to): Specific > implementation. > (rs6000_mode_dependent_address): Stop lying for + const_int. > (rs6000_offsettable_memref_p): Adjust comments accordingly. > * expr.c (convert_move): Use may_narrow_access_to instead of > mode_dependent_address_p where appropriate. > * recog.c (offsettable_address_addr_space_p): Likewise. > (valid_access_mode_change_p): New function. > * recog.h (valid_access_mode_change_p): Declare. > * simplify-rtx.c (simplify_subreg): Use it instead of > mode_dependent_address_p where appropriate. > > testsuite/ > * gcc.dg/offsetmem.c: New test. > > <narrow.dif>