https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106770
Bug ID: 106770 Summary: PPCLE: Unnecessary xxpermdi before mfvsrd Product: gcc Version: 11.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: jens.seifert at de dot ibm.com Target Milestone: --- #include <altivec.h> int cmp2(double a, double b) { vector double va = vec_promote(a, 1); vector double vb = vec_promote(b, 1); vector long long vlt = (vector long long)vec_cmplt(va, vb); vector long long vgt = (vector long long)vec_cmplt(vb, va); vector signed long long vr = vec_sub(vlt, vgt); return vec_extract(vr, 1); } Generates: _Z4cmp2dd: .LFB1: .cfi_startproc xxpermdi 1,1,1,0 xxpermdi 2,2,2,0 xvcmpgtdp 33,2,1 xvcmpgtdp 32,1,2 vsubudm 0,1,0 xxpermdi 0,32,32,3 mfvsrd 3,0 extsw 3,3 blr The unnecessary xxpermdi for vec_promote are already reported in another bugzilla case. mfvsrd can access all 64 vector registers directly and xxpermdi is not required. mfvsrd 3,32 expected instead xxpermdi 0,32,32,3 + mfvsrd 3,0