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}
      Creating newreg=32, assigning class GENERAL_REGS to r32
   18: r32:HI=0
    Inserting insn reload after:
   25: r26:DI#0=r32:HI

            0 Non input pseudo reload: reject++
            1 Non pseudo reload: reject++
            Cycle danger: overall += LRA_MAX_REJECT
          alt=0,overall=608,losers=1,rld_nregs=1
            0 Non input pseudo reload: reject++
            alt=1: Bad operand -- refuse
            alt=2: Bad operand -- refuse
            alt=3: Bad operand -- refuse
         Choosing alt 0 in insn 25:  (0) =rR  (1) rRN {movhi}
      Creating newreg=33, assigning class GENERAL_REGS to r33
   25: r33:HI=r32:HI
    Inserting insn reload after:
   26: r26:DI#0=r33:HI

            0 Non input pseudo reload: reject++
            1 Non pseudo reload: reject++
            Cycle danger: overall += LRA_MAX_REJECT
          alt=0,overall=608,losers=1,rld_nregs=1
            0 Non input pseudo reload: reject++
            alt=1: Bad operand -- refuse
            alt=2: Bad operand -- refuse
            alt=3: Bad operand -- refuse
         Choosing alt 0 in insn 26:  (0) =rR  (1) rRN {movhi}
      Creating newreg=34, assigning class GENERAL_REGS to r34
   26: r34:HI=r33:HI
    Inserting insn reload after:
   27: r26:DI#0=r34:HI
...

I don't know how to read that, and I don't know what to look for to find a 
cause or a cure.  Apart from turning on LRA, the code I'm running is what's in 
the repository, if anyone wants to look at the md file or other bits to offer 
suggestions.

        paul

Reply via email to