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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Last reconfirmed|                            |2023-10-25
           Assignee|unassigned at gcc dot gnu.org      |rguenth at gcc dot 
gnu.org
     Ever confirmed|0                           |1
             Status|UNCONFIRMED                 |ASSIGNED

--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Alex Coplan from comment #0)
> 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;

There's __SIZETYPE__ available for this (for portability)

>   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];

It should be __MEM, not sure why that's not (longer?) dumped correctly.

>   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).

Yeah ... rename them

>  - the type vector(4) int isn't understood by the gimple FE.

You need C frontend like typedefs, basically any not basic type needs to be
manually declared (we don't output type declarations when dumping)

> 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

Ah, it's a TARGET_MEM_REF!  Parsing that isn't supported.  I suggest to
dump before IVOPTs instead.

> 
> . 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.

I'll make TARGET_MEM_REF supported.

Reply via email to