------- Comment #2 from ubizjak at gmail dot com 2007-06-11 07:35 ------- This is the fault of combine pass. It isn't obvious to me, why it is converting:
(insn 7 6 13 2 shift.c:6 (set (subreg:TI (reg:V2DI 62) 0) (ashift:TI (subreg:TI (reg:V2DI 61 [ __a ]) 0) (const_int 64 [0x40]))) 1115 {sse2_ashlti3} (insn_list:REG_DEP_TRUE 6 (nil)) (expr_list:REG_DEAD (reg:V2DI 61 [ __a ]) (expr_list:REG_EQUAL (ashift:TI (subreg:TI (reg/v:V2DI 60 [ __a ]) 0) (const_int 64 [0x40])) (nil)))) ) to (insn 7 6 13 2 shift.c:6 (parallel [ (set (subreg:TI (reg:V2DI 62) 0) (ashift:TI (reg:TI 21 xmm0 [ __a ]) (const_int 64 [0x40]))) (clobber (reg:CC 17 flags)) ]) 412 {*ashlti3_2} (nil) (expr_list:REG_UNUSED (reg:CC 17 flags) (expr_list:REG_DEAD (reg:V2DI 21 xmm0 [ __a ]) (nil)))) Note the clobber in above pattern. So, what is wrong with: (define_insn "sse2_ashlti3" [(set (match_operand:TI 0 "register_operand" "=x") (ashift:TI (match_operand:TI 1 "register_operand" "0") (match_operand:SI 2 "const_0_to_255_mul_8_operand" "n")))] "TARGET_SSE2" -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32280