On 08/14/2018 01:32 PM, Paul Koning wrote:
> I'm trying to convert the pdp11 target to use LRA.
> 
> A lot of it "just works".  But one of the test suite files fails in a way 
> that I can't figure out at all.  I'm hoping for some help or hints to track 
> down the cause and come up with a fix.
> 
> The failing program is testsuite/gcc.c-torture/compile/ifreg.c:
> 
> union foo
> {
>   float f;
>   int i;
> };
> 
> foo (int a, float c)
> {
>   union foo b;
>   b.i = a;
>   return b.f + c;
> }
> 
> When compiled in LRA mode, I get this:
> 
> during RTL pass: reload
> dump file: ifreg.c.274r.reload
> ../../gcc/gcc/testsuite/gcc.c-torture/compile/ifreg.c: In function ‘foo’:
> ../../gcc/gcc/testsuite/gcc.c-torture/compile/ifreg.c:12:1: internal compiler 
> error: Max. number of generated reload insns per insn is achieved (90)
> 
> I fiddled a bit with the mov<mode> patterns, for example disabling the 
> patterns that work on multi-word values (SI and DI mode, since pdp11 word is 
> HImode).  That doesn't fix (or create) the failure, though the specific insns 
> change as a result.
> 
> What I see going in to reload (from the "ira" dump file) is:
> 
> (note 5 1 2 2 [bb 2] NOTE_INSN_BASIC_BLOCK)
> (note 2 5 4 2 NOTE_INSN_DELETED)
> (note 4 2 22 2 NOTE_INSN_FUNCTION_BEG)
> (insn 22 4 18 2 (clobber (reg/v:DI 26 [ b ])) 
> "../../gcc/gcc/testsuite/gcc.c-torture/compile/ifreg.c":10 -1
>      (nil))
> (insn 18 22 19 2 (set (subreg:HI (reg/v:DI 26 [ b ]) 0)
>         (const_int 0 [0])) 
> "../../gcc/gcc/testsuite/gcc.c-torture/compile/ifreg.c":10 21 {movhi}
>      (nil))
> (insn 19 18 20 2 (set (subreg:HI (reg/v:DI 26 [ b ]) 2)
>         (const_int 0 [0])) 
> "../../gcc/gcc/testsuite/gcc.c-torture/compile/ifreg.c":10 21 {movhi}
>      (nil))
> ...
> 
> Reload shows this:
> 
> (note 5 1 2 2 [bb 2] NOTE_INSN_BASIC_BLOCK)
> (note 2 5 4 2 NOTE_INSN_DELETED)
> (note 4 2 22 2 NOTE_INSN_FUNCTION_BEG)
> (insn 22 4 18 2 (clobber (reg/v:DI 26 [ b ])) 
> "../../gcc/gcc/testsuite/gcc.c-torture/compile/ifreg.c":10 -1
>      (nil))
> (insn 18 22 25 2 (set (reg:HI 32)
>         (const_int 0 [0])) 
> "../../gcc/gcc/testsuite/gcc.c-torture/compile/ifreg.c":10 21 {movhi}
>      (nil))
> (insn 25 18 26 2 (set (reg:HI 33)
>         (reg:HI 32)) 
> "../../gcc/gcc/testsuite/gcc.c-torture/compile/ifreg.c":10 21 {movhi}
>      (nil))
> (insn 26 25 27 2 (set (reg:HI 34)
>         (reg:HI 33)) 
> "../../gcc/gcc/testsuite/gcc.c-torture/compile/ifreg.c":10 21 {movhi}
>      (nil))
> (insn 27 26 28 2 (set (reg:HI 35)
>         (reg:HI 34)) 
> "../../gcc/gcc/testsuite/gcc.c-torture/compile/ifreg.c":10 21 {movhi}
>      (nil))
> ... with insns that do nothing, like the one above, repeating until it gives 
> up.
> 
> At the top of the dump file where LRA is reporting what it's doing, I see 
> this:
> 
> ********** Local #1: **********
> 
>          Spilling non-eliminable hard regs: 6
> New elimination table:
> Can eliminate 15 to 6 (offset=10, prev_offset=0)
> Can eliminate 15 to 5 (offset=4, prev_offset=0)
> Can eliminate 14 to 6 (offset=8, prev_offset=0)
> Can eliminate 14 to 5 (offset=0, prev_offset=0)
>             0 Non input pseudo reload: reject++
>           alt=0,overall=7,losers=1,rld_nregs=1
>             0 Non input pseudo reload: reject++
>           alt=1,overall=7,losers=1,rld_nregs=1
>             alt=2: Bad operand -- refuse
>             alt=3: Bad operand -- refuse
>        Choosing alt 0 in insn 18:  (0) =rR  (1) rRN {movhi}
We've selected alternative 0 for insn 18.  I believe that's the rRN ->
=rR alternative.


>       Creating newreg=32, assigning class GENERAL_REGS to r32
The insn did not match its constraints.  So some kind of reload is
needed.  We allocate a new reload register r32.

>    18: r32:HI=0
>     Inserting insn reload after:
And we try to initialize r32 to 0.  Which of course needs another reload.

I suspect LRA is somehow missing that the operand could live in memory.


Jeff

Reply via email to