>> Would it help to rearrange the constraints to have reg +=
>> mem|reg|constant before the addreg += ...  ?
>
>Probably not in this case.  You could try it.  It is true that when
>two alternatives have the same cost, reload will pick the first one
>listed.

With my luck that will cause a bigger problem somewhere else. :)  I'll
try it once I get past this.

>> >I don't know where else register 1421 is being used, so my tentative
>> >guess would be that gcc is picking an address register based on the
>> >constraints in addsi3_5200.  Perhaps you need to change "?a" to "*a".
>> >After all, you probably don't want to encourage pseudos to go into the
>> >address registers merely because you add values to them.
>> 
>> 1421 is only used in 5559 and 5560.  from the lreg dump:
>> 
>> Register 1421 used 2 times across 2 insns in block 694; set 1 time; pref 
>> DATA_REGS.
>
>That is odd.  Your earlier e-mail seemed to show that register 1421
>was specifically put into an address register, specifically %a0.  Why
>would that happen if it has a preference for DATA_REGS?  Was it
>assigned by local-alloc?  In that case you would see a line like ";;
>Register 2421 in NNN." in the .lreg dump file.

Uggh.  I've been trying changes currently so I don't have the original
compiler to regenerate the output.

>> The problem is that there is no valid QImode instruction that can move
>> values in/out of an address register....
>
>I know.  I'm suggesting that QImode values have to move in and out of
>address registers via data registers, so you just put the QImode value
>into the data register, and then move it into the address register, or
>vice-versa.

Is there another backend in GCC I can look at for examples of how this
is done?

>> Which looks like it allows QImode into ADDR_REGS instead
>> of insisting on DATA_REGS.  Do you think this should be:
>
>No, that will break reload.  If it calls PREFERRED_RELOAD_CLASS with
>ADDR_REGS, then it has already selected an alternative which requires
>ADDR_REGS.  Returning a register class which does not permit any
>register in ADDR_REGS will give you a constraint violation later on.

Well I tried it anyway and was able to build a complete C
toolchain(including glibc-2.3.2), but it blew up at the same point
building perl with a constraint violation of:

pp_pack.c: In function `S_unpack_rec':
pp_pack.c:2220: error: insn does not satisfy its constraints:
(insn 5559 8594 8595 694 pp_pack.c:2144 (set (reg:SI 8 %a0 [1421])
        (plus:SI (reg:SI 0 %d0)
            (const_int -32 [0xffffffe0]))) 121 {*addsi3_5200} (insn_list 5558 
(nil))
    (nil))
pp_pack.c:2220: internal compiler error: in reload_cse_simplify_operands, at 
postreload.c:391

This would be easy to fix by adding "?r/r/mi" to addsi3_5200 and
emit code that first 'move.l %1,%0', and then add the string from
output_addsi3().

That is assuming that changing PREFERRED_RELOAD_CLASS this way doesn't
severely break reload.

Where in reload would you think it decides that it absolutely has to
have an ADDR_REG for 1421?  I'll dig into it with gdb, but there's so
much code in reload that a clue or two would *really* help :)

I'll undo the change to PREFERRED_RELOAD_CLASS, and then change the
'?a' to '*a' in addsi3_5200 to see if that helps reload to not pick
and ADDR_REG for the value.  If it still fails, I'll regenerate all
the information as I did in the 2nd email to you.

Thanks!

-- 
Peter Barada
[EMAIL PROTECTED]

Reply via email to