This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Problem with post_modify


Jon Beniston wrote:
The problems appears because this RTX:
(post_modify:HI (reg/v/f:HI 48)
is somehow transformed into this:
(post_modify:HI (mem:HI (plus:HI (reg/f:HI 0 sp)

I'd guess a REG_OK_STRICT problem. During reload, any pseudo-reg which is not allocated to a hard reg is actually a MEM, because it will later be converted into a stack slot. So you have to be careful when handling pseudos to remember that a pseudo can be either a REG or a MEM depending on what the register allocator does with it.


This distinction is handled by REG_OK_STRICT. Two sets of macros get defined, one with REG_OK_STRICT false and one with REG_OK_STRICT true. When REG_OK_STRICT is true, a pseudo-reg should be considered a MEM, and should be accepted anyplace where a REG is required. When REG_OK_STRICT is false, a pseudo-reg should be considered a REG, and accepted anyplace where a hard register is required.

The macros affected by this are GO_IF_LEGITIMATE_ADDRESS, REG_OK_FOR_BASE, REG_OK_FOR_INDEX, etc.

People often get into trouble when they try to write these macros to calls functions. If you do that, then you have to pass in the value of REG_OK_STRICT, and test it inside the function. See for instance what the mips port does.
--
Jim Wilson, GNU Tools Support, http://www.SpecifixInc.com



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]