http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50788
--- Comment #7 from Uros Bizjak <ubizjak at gmail dot com> 2011-10-23 11:45:32 UTC --- (In reply to comment #6) > > It is OK for expanders to have match_dup. We just don't want to have > > post-reload passes to trip on double-output to the same register. > > No disagreement. I just wanted to state the argument for the + approach, but > the manual clearly points to the match_operand approach here instead. cprop_hardreg of 4-6 branch is even more confused: (insn 30 5 10 2 (set (reg:V4DF 22 xmm1 [63]) (const_vector:V4DF [ (const_double:DF 0.0 [0x0.0p+0]) (const_double:DF 0.0 [0x0.0p+0]) (const_double:DF 0.0 [0x0.0p+0]) (const_double:DF 0.0 [0x0.0p+0]) ])) pr50788.c:6 1120 {*avx_movv4df_internal} (expr_list:REG_EQUAL (const_vector:V4DF [ (const_double:DF 0.0 [0x0.0p+0]) (const_double:DF 0.0 [0x0.0p+0]) (const_double:DF 0.0 [0x0.0p+0]) (const_double:DF 0.0 [0x0.0p+0]) ]) (nil))) (insn 10 30 16 2 (set (reg:V4DF 22 xmm1 [63]) (unspec:V4DF [ (mem:V4DF (reg/v/f:DI 5 di [orig:61 __P ] [61]) [0 S32 A8]) (reg/v:V4DI 21 xmm0 [orig:62 __M ] [62]) (reg:V4DF 21 xmm0 [63]) ] UNSPEC_MASKLOAD)) pr50788.c:6 2086 {avx_maskloadpd256} (expr_list:REG_DEAD (reg/v:V4DI 21 xmm0 [orig:62 __M ] [62]) (expr_list:REG_DEAD (reg/v/f:DI 5 di [orig:61 __P ] [61]) (nil)))) See how in (insn 10) pseudo [63] gets allocated xmm1 _and_ xmm0. Following DCE is more than happy to throw everything out of instruction stream.