------- Comment #13 from steven at gcc dot gnu dot org 2005-10-28 15:58 ------- Smaller test case:
// Compile with -O2 -maltivec // // Works with GCC 3.3.5 and GCC 4.0.2 // ICEs with GCC 4.1 from today's CVS #include <altivec.h> #define REGLIST \ "77", "78", "79", "80", "81", "82", "83", "84", "85", "86",\ "87", "88", "89", "90", "91", "92", "93", "94", "95", "96",\ "97", "98", "99", "100", "101", "102", "103", "104", "105", "106",\ "107", "108" void foo (int H) { volatile __attribute__ ((altivec (vector__))) unsigned char tmp; while (H-- > 0) { asm ("" : : : REGLIST); tmp = ( __attribute__ ((altivec (vector__))) unsigned char) (( __attribute__ ((altivec (vector__))) unsigned short) vec_splat_s16 (((5)))); } } Note that this is really a register allocation problem that we fail on because our register allocator doesn't know about liveness inside blocks, only at the start and end of a block. But the situation is easily reproducible as long as you pump the register pressure up far enough. The problem seems to be in reload const-to-mem. We start with this: (insn:HI 26 22 56 2 (set (mem/v/c/i:V16QI (plus:SI (reg/f:SI 113 sfp) (const_int 16 [0x10])) [0 tmp+0 S16 A128]) (subreg:V16QI (reg:V8HI 128) 0)) 467 {altivec_stvx_v16qi} (insn_list:REG_DEP_TRUE 22 (nil)) (expr_list:REG_EQUAL (const_vector:V16QI [ (const_int 0 [0x0]) (const_int 5 [0x5]) (const_int 0 [0x0]) (const_int 5 [0x5]) (const_int 0 [0x0]) (const_int 5 [0x5]) (const_int 0 [0x0]) (const_int 5 [0x5]) (const_int 0 [0x0]) (const_int 5 [0x5]) (const_int 0 [0x0]) (const_int 5 [0x5]) (const_int 0 [0x0]) (const_int 5 [0x5]) (const_int 0 [0x0]) (const_int 5 [0x5]) ]) (nil))) and we end with this (were we ICE on insn 65): (insn 65 22 64 2 (set (reg:V16QI 77 0) (mem/u/c/i:V16QI (symbol_ref/u:SI ("*.LC0") [flags 0x2]) [0 S16 A128])) -1 (nil) (nil)) (insn 64 65 26 2 (set (reg:SI 9 9) (plus:SI (reg/f:SI 1 1) (const_int 16 [0x10]))) 31 {*addsi3_internal1} (nil) (nil)) (insn:HI 26 64 56 2 (set (mem/v/c/i:V16QI (reg:SI 9 9) [0 tmp+0 S16 A128]) (reg:V16QI 77 0)) 467 {altivec_stvx_v16qi} (insn_list:REG_DEP_TRUE 22 (nil)) (expr_list:REG_EQUAL (const_vector:V16QI [ (const_int 0 [0x0]) (const_int 5 [0x5]) (const_int 0 [0x0]) (const_int 5 [0x5]) (const_int 0 [0x0]) (const_int 5 [0x5]) (const_int 0 [0x0]) (const_int 5 [0x5]) (const_int 0 [0x0]) (const_int 5 [0x5]) (const_int 0 [0x0]) (const_int 5 [0x5]) (const_int 0 [0x0]) (const_int 5 [0x5]) (const_int 0 [0x0]) (const_int 5 [0x5]) ]) (nil))) -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24230