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

            Bug ID: 111975
           Summary: gimple front end can't round-trip vectorized code
           Product: gcc
           Version: 14.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: acoplan at gcc dot gnu.org
  Target Milestone: ---

Take the following testcase on aarch64:

void foo(int *restrict a, int *restrict b, int *restrict c)
{
    for (int i = 0; i < 256; i++)
      a[i] = b[i] + c[i];
}

compiled with -O2 -fdump-tree-optimized-gimple, we get the IR:

void __GIMPLE (ssa,guessed_local(10737416))
foo (int * restrict a, int * restrict b, int * restrict c)
{
  sizetype ivtmp.17;
  vector(4) int vect__8.10;
  vector(4) int vect__6.9;
  vector(4) int vect__4.6;

  __BB(2,guessed_local(10737416)):
  goto __BB3(precise(134217728));

  __BB(3,loop_header(1),guessed_local(687194626)):
  ivtmp.17_23 = __PHI (__BB3: ivtmp.17_19, __BB2: 0ul);
  vect__4.6_9 = MEM <vector(4) int> [(int *)b_12(D) + ivtmp.17_23 * 1];
  vect__6.9_27 = MEM <vector(4) int> [(int *)c_13(D) + ivtmp.17_23 * 1];
  vect__8.10_28 = vect__4.6_9 + vect__6.9_27;
  MEM <vector(4) int> [(int *)a_14(D) + ivtmp.17_23 * 1] = vect__8.10_28;
  ivtmp.17_19 = ivtmp.17_23 + 16ul;
  if (ivtmp.17_19 != 1024ul)
    goto __BB3(guessed(132120577));
  else
    goto __BB4(guessed(2097151));

  __BB(4,guessed_local(10737416)):
  return;

}

but trying to compile this with -fgimple shows several problems:

 - the type sizetype isn't known.
 - ivtmp.17 isn't accepted as a variable name (indeed none of the variables
with . in the name are accepted).
 - the type vector(4) int isn't understood by the gimple FE.

If I fix these issues by declaring the types as follows:

typedef unsigned long sizetype;
typedef int __attribute__((vector_size(16))) V;

and substituting all uses of the old type names, and also rename all variables
to replace . with _, then it is nearly accepted. One remaining problem seems to
be that the MEM syntax isn't accepted:

  vect__4_6_9 = MEM <V> [(int *)b_12(D) + ivtmp_17_23 * 1];

gives:

error: 'MEM' undeclared (first use in this function)

and attempting to convert the MEM to use something closer to the syntax in the
gcc.dg/gimplefe-* tests, this still fails:

  vect__4_6_9 = __MEM <V> ((int *)b_12(D) + ivtmp_17_23 * 1);

is rejected with:

error: expected ')' before '*' token

. It would be good if these issues could be fixed so that optimized gimple can
be round-tripped without laborious manual fixing of the input. Even with that,
it's still not clear how to make the MEM expressions here get accepted.

Reply via email to