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.