https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93127

            Bug ID: 93127
           Summary: PPC altivec vec_promote creates unnecessary xxpermdi
                    instruction
           Product: gcc
           Version: 8.3.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: ---

vec_promote can leave half of register undefined and therefore should not issue
extra instruction.

Input:
#include <altivec.h>

double vmax(double a, double b)
{
#ifdef _BIG_ENDIAN
   const int PREF = 0;
#else
   const int PREF = 1;
#endif
   vector double va = vec_promote(a,PREF);
   vector double vb = vec_promote(b,PREF);
   return vec_extract(vec_max(va, vb), PREF);
}

Output:
._Z4vmaxdd:
LFB..0:
        xxpermdi 2,2,2,0
        xxpermdi 1,1,1,0
        xvmaxdp 1,1,2
         # vec_extract to same register
        blr

Both xxpermdi are unnecessary.

Reply via email to