I'm doing cleanup on the pdp11 back end to get rid of a number of ICE in the test suite. One is in gcc.c-torture/compile/20001221.c -- it works in GCC 4 but fails in GCC 5 and later.
In the dumps, I see in the output from the expand phase a large number of memory reference via the "virtual-stack-vars" pseudo-register. In vregs those all become frame pointer references in V4, but in V5 and later, about 10% of them remain pseudo-register references all the way through final assembly output generation. There things blow up because it's an invalid base register. Here are some snippets: static void foo () { long maplength; int type; { const long nibbles = 8; char buf1[nibbles + 1]; ... V4, expand output: ;; nibbles_18 = 8; (insn 7 6 0 (set (mem/c:SI (plus:HI (reg/f:HI 17 virtual-stack-vars) (const_int -8 [0xfffffffffffffff8])) [0 nibbles+0 S4 A16]) (const_int 8 [0x8])) /Users/pkoning/Documents/svn/gcc/gcc/testsuite/gcc.c-torture/compile/20001221-1.c:8 -1 (nil)) ;; _19 = (sizetype) nibbles_18; (insn 8 7 0 (set (mem/c:HI (plus:HI (reg/f:HI 17 virtual-stack-vars) (const_int -10 [0xfffffffffffffff6])) [0 D.1480+0 S2 A16]) (subreg:HI (mem/c:SI (plus:HI (reg/f:HI 17 virtual-stack-vars) (const_int -8 [0xfffffffffffffff8])) [0 nibbles+0 S4 A16]) 0)) /Users/pkoning/Documents/svn/gcc/gcc/testsuite/gcc.c-torture/compile/20001221-1.c:9 -1 (nil)) The second insn is picking up the low order half of "nibbles" to use as the index; note that Pmode is HI for this target. The vregs pass turns it into this: (insn 7 6 8 2 (set (mem/c:SI (plus:HI (reg/f:HI 14 fp) (const_int -8 [0xfffffffffffffff8])) [0 nibbles+0 S4 A16]) (const_int 8 [0x8])) /Users/pkoning/Documents/svn/gcc/gcc/testsuite/gcc.c-torture/compile/20001221-1.c:8 12 {movsi} (nil)) (insn 8 7 9 2 (set (mem/c:HI (plus:HI (reg/f:HI 14 fp) (const_int -10 [0xfffffffffffffff6])) [0 D.1480+0 S2 A16]) (subreg:HI (mem/c:SI (plus:HI (reg/f:HI 17 virtual-stack-vars) (const_int -8 [0xfffffffffffffff8])) [0 nibbles+0 S4 A16]) 0)) /Users/pkoning/Documents/svn/gcc/gcc/testsuite/gcc.c-torture/compile/20001221-1.c:9 14 {movhi} (nil)) which is what I would expect. In V5, the expand output is the same: (insn 7 6 0 (set (mem/c:SI (plus:HI (reg/f:HI 17 virtual-stack-vars) (const_int -8 [0xfffffffffffffff8])) [0 nibbles+0 S4 A16]) (const_int 8 [0x8])) /Users/pkoning/Documents/svn/gcc/gcc/testsuite/gcc.c-torture/compile/20001221-1.c:8 -1 (nil)) ;; _19 = (sizetype) nibbles_18; (insn 8 7 0 (set (mem/c:HI (plus:HI (reg/f:HI 17 virtual-stack-vars) (const_int -10 [0xfffffffffffffff6])) [0 D.1480+0 S2 A16]) (subreg:HI (mem/c:SI (plus:HI (reg/f:HI 17 virtual-stack-vars) (const_int -8 [0xfffffffffffffff8])) [0 nibbles+0 S4 A16]) 0)) /Users/pkoning/Documents/svn/gcc/gcc/testsuite/gcc.c-torture/compile/20001221-1.c:9 -1 (nil)) but now vregs doesn't convert the virtual-stack-vars reference in the subreg operand: (insn 7 6 8 2 (set (mem/c:SI (plus:HI (reg/f:HI 14 fp) (const_int -8 [0xfffffffffffffff8])) [0 nibbles+0 S4 A16]) (const_int 8 [0x8])) /Users/pkoning/Documents/svn/gcc/gcc/testsuite/gcc.c-torture/compile/20001221-1.c:8 12 {movsi} (nil)) (insn 8 7 9 2 (set (mem/c:HI (plus:HI (reg/f:HI 14 fp) (const_int -10 [0xfffffffffffffff6])) [0 D.1480+0 S2 A16]) (subreg:HI (mem/c:SI (plus:HI (reg/f:HI 17 virtual-stack-vars) (const_int -8 [0xfffffffffffffff8])) [0 nibbles+0 S4 A16]) 0)) /Users/pkoning/Documents/svn/gcc/gcc/testsuite/gcc.c-torture/compile/20001221-1.c:9 14 {movhi} (nil)) Is this something the back end is responsible for getting right, for example via the machine description file? If so, any hints where to start? paul