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

            Bug ID: 103076
           Summary: slp vectorizer failed to try smaller lenth.
           Product: gcc
           Version: 12.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: crazylht at gmail dot com
  Target Milestone: ---
              Host: x86_64-pc-linux-gnu
            Target: s390x-ibm-linux-gnu

struct Ax
{
  int n;
  short a[4];
};
void
foo4_2 (struct Ax *p)
{
  p->a[0] = 0;
  p->a[1] = 1;
  p->a[2] = 2;
  p->a[3] = 3;
}

Struct is 4-byte aligned, and gcc failed to vectorize it since s390 backend
doesn't support unaligned vector(4) short store. But it can be splitted into 2
vector(2) short store, i.e.

struct Ax
{
  int n;
  short a[4];
};
void
foo4_2 (struct Ax *p)
{
  p->a[0] = 0;
  p->a[1] = 1;
}


void
foo4_3 (struct Ax *p)
{
  p->a[2] = 2;
  p->a[3] = 3;
}


Gcc can vectorize both foo4_2 and foo4_3 with 
add new stmt: MEM <vector(2) short int> [(short int *)vectp.5_5] = { 0, 1 };
add new stmt: MEM <vector(2) short int> [(short int *)vectp.10_5] = { 2, 3 }

Reply via email to