https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106770
--- Comment #9 from Surya Kumari Jangala <jskumari at gcc dot gnu.org> --- RTL after dfinit pass for the vec_sub() and the vec_extract(): (insn 13 12 14 2 (set (reg:V2DI 132 [ vrD.3952 ]) (minus:V2DI (subreg:V2DI (reg:V2DF 117 [ _1 ]) 0) (subreg:V2DI (reg:V2DF 118 [ _2 ]) 0))) "cpm2.c":9:29 1689 {subv2di3} (nil)) (insn 14 13 15 2 (set (reg:DI 133) (vec_select:DI (reg:V2DI 132 [ vrD.3952 ]) (parallel [ (const_int 1 [0x1]) ]))) "cpm2.c":11:12 1371 {*vsx_extract_v2di_0} (nil)) (insn 15 14 16 2 (set (reg:DI 119 [ _3 ]) (reg:DI 133)) "cpm2.c":11:12 679 {*movdi_internal64} (nil)) (insn 16 15 17 2 (set (reg:SI 134) (subreg:SI (reg:DI 119 [ _3 ]) 0)) "cpm2.c":11:12 discrim 1 555 {*movsi_internal1} (nil)) (insn 17 16 18 2 (set (reg:DI 135) (sign_extend:DI (reg:SI 134))) "cpm2.c":11:12 discrim 1 31 {extendsidi2} (nil)) (insn 18 17 22 2 (set (reg:DI 127 [ <retval> ]) (reg:DI 135)) "cpm2.c":11:12 discrim 1 679 {*movdi_internal64} (nil)) (insn 22 18 23 2 (set (reg/i:DI 3 3) (reg:DI 127 [ <retval> ])) "cpm2.c":12:1 679 {*movdi_internal64} (nil)) (insn 23 22 0 2 (use (reg/i:DI 3 3)) "cpm2.c":12:1 -1 (nil)) ---------- RTL after swaps pass: (insn 13 12 14 2 (set (reg:V2DI 132 [ vrD.3952 ]) (minus:V2DI (subreg:V2DI (reg:V2DF 117 [ _1 ]) 0) (subreg:V2DI (reg:V2DF 118 [ _2 ]) 0))) "cpm2.c":9:29 1689 {subv2di3} (nil)) (insn 14 13 15 2 (set (reg:DI 133) (vec_select:DI (reg:V2DI 132 [ vrD.3952 ]) (parallel [ (const_int 0 [0]) ]))) "cpm2.c":11:12 -1 (nil)) ---------- 'swaps' pass occurs after 'dfinit' pass. After dfinit pass, we are extracting the correct element (1st element). See the vec_select in insn 14. But after 'swaps' pass, the element being extracted changes to 0.