------- Comment #10 from hjl dot tools at gmail dot com 2009-01-19 19:30 ------- The problem is x86 doesn't set the memory size correct for rep_stos. Gcc 4.3.3 gave:
(gdb) call debug_rtx (destmem) (mem/s/c:BLK (reg:DI 59) [3 buffer+8 S1 A64]) (gdb) Jakub's patch corrected it to (gdb) call debug_rtx (destmem) (mem/s/c:BLK (reg:DI 59) [0 buffer+8 S1016 A64]) (gdb) Since scheduler thinks the size of memory is 1, it changed (insn:HI 13 12 15 2 x.c:5 (parallel [ (set (reg:DI 2 cx [62]) (const_int 0 [0x0])) (set (reg:DI 5 di [59]) (plus:DI (ashift:DI (reg:DI 2 cx [62]) (const_int 3 [0x3])) (reg:DI 5 di [59]))) (set (mem/s/c:BLK (reg:DI 5 di [59]) [3 buffer+8 S1 A64]) (const_int 0 [0x0])) (use (reg:DI 0 ax [60])) (use (reg:DI 2 cx [62])) ]) 801 {*rep_stosdi_rex64} (expr_list:REG_DEAD (reg:DI 0 ax [60]) (expr_list:REG_UNUSED (reg:DI 5 di [59]) (expr_list:REG_UNUSED (reg:DI 2 cx [62]) (nil))))) ... (insn:HI 22 65 24 2 x.c:6 (set (mem/s/c:HI (plus:DI (reg/f:DI 7 sp) (const_int 24 [0x18])) [0 buffer+24 S2 A64]) (const_int 111 [0x6f])) 53 {*movhi_1} (nil) into (insn:HI 22 65 24 2 x.c:6 (set (mem/s/c:HI (plus:DI (reg/f:DI 7 sp) (const_int 24 [0x18])) [0 buffer+24 S2 A64]) (const_int 111 [0x6f])) 53 {*movhi_1} (nil) ... (insn:TI 13 22 68 2 x.c:5 (parallel [ (set (reg:DI 2 cx [62]) (const_int 0 [0x0])) (set (reg:DI 5 di [59]) (plus:DI (ashift:DI (reg:DI 2 cx [62]) (const_int 3 [0x3])) (reg:DI 5 di [59]))) (set (mem/s/c:BLK (reg:DI 5 di [59]) [3 buffer+8 S1 A64]) (const_int 0 [0x0])) (use (reg:DI 0 ax [60])) (use (reg:DI 2 cx [62])) ]) 801 {*rep_stosdi_rex64} (expr_list:REG_DEAD (reg:DI 0 ax [60]) (expr_list:REG_UNUSED (reg:DI 5 di [59]) (expr_list:REG_UNUSED (reg:DI 2 cx [62]) (nil))))) -- hjl dot tools at gmail dot com changed: What |Removed |Added ---------------------------------------------------------------------------- Severity|normal |critical http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38902