Hi Richard Thank you for the detailed explanation. It sounds like an inherent difficulty of rtl passes. Then the only opportunity is ldrb/strb instructions because they never affect cc registers.
thanks Carrot On Fri, Apr 15, 2011 at 9:34 PM, Richard Earnshaw <rearn...@arm.com> wrote: > > On Thu, 2011-04-14 at 21:19 +0800, Carrot Wei wrote: >> On Fri, Apr 8, 2011 at 6:51 PM, Ramana Radhakrishnan >> <ramana.radhakrish...@linaro.org> wrote: >> > On 08/04/11 10:57, Carrot Wei wrote: >> >> >> >> Hi >> >> >> >> This is the second part of the fixing for >> >> >> >> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47855 >> >> >> >> This patch contains the length computation for insn patterns >> >> "*arm_movqi_insn" >> >> and "*arm_addsi3". Since the alternatives and encodings are much more >> >> complex, >> >> the attribute length is computed in separate C functions. >> >> > Sorry, no. This is potentially a maintenance pain. It hardcodes >> > alternatives >> > from a pattern elsewhere in the C file. I don't like doing this unless we >> > have to with the sync primitives or with push_multi. In this case I'm not >> > convinced we need such functions in the .c file. >> > >> > Why can't we use the "enabled" attribute here with appropriate constraints >> > for everything other than the memory cases (even there we might be able to >> > invent some new constraints) ? >> > >> > Also a note about programming style. There are the helper macros like >> > REG_P, >> > CONST_INT_P and MEM_P which remove the necessity for checks like >> > >> > GET_CODE (x) == y where y E { REG, CONST_INT, MEM} >> >> Hi Ramana >> >> As you suggested I created several new constraints, and use the >> "enabled" attribute to split the current alternatives in this new >> patch. It has been tested on arm qemu without regression. >> >> thanks >> Carrot > > > Sorry, I don't think this approach can work. Certainly not with the way > the compiler currently works, and especially for mov and add insns. > > These instructions are only 2 bytes long if either: > 1) They clobber the condition code register or > 2) They occur inside an IT block. > > We can't tell either of these from the pattern, so you're > underestimating the length of the instruction in some circumstances by > claiming that they are only 2 bytes long. That /will/ lead to broken > code someday. > > We can't add potential clobbers to mov and add patterns because that > will break reload which relies on these patterns being simple-set insns > with no added baggage. It *might* be possible to add clobbers to other > operations, but that will then most-likely upset instruction scheduling > (I think the scheduler treats two insns that clobber the same hard reg > as being strongly ordered). Putting in the clobber too early will > certainly affect cond-exec generation. > > In short, I'm not aware of a simple way to address this problem so that > we get accurate length information, but minimal impact on other passes > in the compiler. > > R. > > >