------- Comment #3 from rguenth at gcc dot gnu dot org 2006-10-09 14:58 ------- Confirmed. Ok for x86_64:
f: .LFB2: movslq %edi,%rdi movslq %esi,%rsi imulq %rdi, %rsi sarq $15, %rsi movl %esi, %eax ret We are expanding (int) ((long long int) b * (long long int) a >> 15). We split (insn:HI 11 31 12 2 (parallel [ (set (reg:DI 0 ax [62]) (mult:DI (sign_extend:DI (reg/v:SI 0 ax [orig:60 b ] [60])) (sign_extend:DI (mem/c/i:SI (plus:SI (reg/f:SI 7 sp) (const_int 4 [0x4])) [2 a+0 S4 A32])))) (clobber (reg:CC 17 flags)) ]) 265 {*mulsidi3_insn} (insn_list:REG_DEP_TRUE 7 (nil)) (expr_list:REG_UNUSED (reg:CC 17 flags) (nil))) (insn:HI 12 11 17 2 (parallel [ (set (reg:DI 0 ax [62]) (ashiftrt:DI (reg:DI 0 ax [62]) (const_int 15 [0xf]))) (clobber (reg:CC 17 flags)) ]) 437 {*ashrdi3_1} (insn_list:REG_DEP_TRUE 11 (nil)) (expr_list:REG_UNUSED (reg:CC 17 flags) (expr_list:REG_UNUSED (reg:SI 1 dx) (nil)))) into (insn:TI 11 31 37 2 (parallel [ (set (reg:DI 0 ax [62]) (mult:DI (sign_extend:DI (reg/v:SI 0 ax [orig:60 b ] [60])) (sign_extend:DI (mem/c/i:SI (plus:SI (reg/f:SI 7 sp) (const_int 4 [0x4])) [2 a+0 S4 A32])))) (clobber (reg:CC 17 flags)) ]) 265 {*mulsidi3_insn} (nil) (expr_list:REG_UNUSED (reg:CC 17 flags) (nil))) (insn:TI 37 11 38 2 (parallel [ (set (reg:SI 0 ax [62]) (ior:SI (ashiftrt:SI (reg:SI 0 ax [62]) (const_int 15 [0xf])) (ashift:SI (reg:SI 1 dx [+4 ]) (minus:QI (const_int 32 [0x20]) (const_int 15 [0xf]))))) (clobber (reg:CC 17 flags)) ]) 438 {x86_shrd_1} (nil) (expr_list:REG_UNUSED (reg:CC 17 flags) (nil))) (insn:TI 38 37 26 2 (parallel [ (set (reg:SI 1 dx [+4 ]) (ashiftrt:SI (reg:SI 1 dx [+4 ]) (const_int 15 [0xf]))) (clobber (reg:CC 17 flags)) ]) 443 {*ashrsi3_1} (nil) (expr_list:REG_UNUSED (reg:CC 17 flags) (expr_list:REG_UNUSED (reg:SI 1 dx [+4 ]) (nil)))) note the problematic partially dead DI ax:dx which flow does not handle, so the redundant instruction does not get deleted. A peephole might be able to fix this until new dataflow maybe handles this case(?). -- rguenth at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |rguenth at gcc dot gnu dot | |org, hubicka at gcc dot gnu | |dot org Severity|enhancement |normal Status|UNCONFIRMED |NEW Ever Confirmed|0 |1 GCC host triplet|i486 | GCC target triplet| |i?86-*-* Known to fail|4.0.3 4.1.1 |4.0.3 4.1.1 4.2.0 Last reconfirmed|0000-00-00 00:00:00 |2006-10-09 14:58:01 date| | Summary|[regression] missed- |[4.0/4.1/4.2 Regression] |optimization (in unneeded |missed-optimization (in |code elimination) |unneeded code elimination) Target Milestone|--- |4.0.4 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29401