------- Comment #12 from steven at gcc dot gnu dot org 2006-01-08 00:45 ------- I looked at what is going on here with "GNU C version 4.1.0 20060107 (prerelease) (x86_64-unknown-linux-gnu)"
We produce the invalid insn in replace_store_insn, where we have: (gdb) p debug_rtx(del) (insn 19 17 21 0 (parallel [ (set (mem/s:SI (reg/v/f:DI 63 [ s ]) [3 <variable>.buf+0 S4 A32]) (ashift:SI (mem/s:SI (reg/v/f:DI 63 [ s ]) [3 <variable>.buf+0 S4 A32]) (subreg:QI (reg/v:SI 64 [ n ]) 0))) (clobber (reg:CC 17 flags)) ]) 413 {*ashlsi3_1} (nil) (nil)) gen_move_insn is used to produce a move for this: replace_store_insn (reg=0x2aaaaafcc000, del=0x2aaaaafc73c0, bb=0x2aaaaafb9780, smexpr=0xcdae70) at gcse.c:6296 6296 mem = smexpr->pattern; (gdb) p debug_rtx(del) (insn 19 17 21 0 (parallel [ (set (mem/s:SI (reg/v/f:DI 63 [ s ]) [3 <variable>.buf+0 S4 A32]) (ashift:SI (mem/s:SI (reg/v/f:DI 63 [ s ]) [3 <variable>.buf+0 S4 A32]) (subreg:QI (reg/v:SI 64 [ n ]) 0))) (clobber (reg:CC 17 flags)) ]) 413 {*ashlsi3_1} (nil) (nil)) $8 = void (gdb) next 6297 insn = gen_move_insn (reg, SET_SRC (single_set (del))); (gdb) p debug_rtx(mem) (mem/s:SI (reg/v/f:DI 63 [ s ]) [3 <variable>.buf+0 S4 A32]) $9 = void (gdb) next 6298 insn = emit_insn_after (insn, del); (gdb) p debug_rtx(insn) (insn 57 0 0 (set (reg:SI 65) (ashift:SI (mem/s:SI (reg/v/f:DI 63 [ s ]) [3 <variable>.buf+0 S4 A32]) (subreg:QI (reg/v:SI 64 [ n ]) 0))) -1 (nil) (nil)) $10 = void (gdb) p recog_memoized (insn) $11 = -1 -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24257