Hi! On Thu, Mar 09, 2023 at 05:30:53PM +0800, Kewen.Lin wrote: > on 2023/3/9 07:01, Peter Bergner via Gcc-patches wrote: > > PR109073 shows a problem where GCC 11 and GCC 10 do not accept a const > > __vector_pair pointer operand to some MMA builtins, which GCC 12 and later > > correctly accept. Fixed here by initializing the builtins to accept const > > pointers.
"Pointers to const" is the more correct. A "const pointer" is e.g. int *const p; not the same thing at all, and sometimes this is useful to have ;-) > > This patch was tested in both GCC 11 and GCC 10 on powerpc64le-linux and > > showed no regressions. Ok for backports? It isn't truly a backport. You can put it on 11 and 10 at the same time, there is no benefit doing it on 11 only first. > > { > > op[nopnds++] = build_pointer_type (void_type_node); > > if (d->code == MMA_BUILTIN_DISASSEMBLE_ACC) > > - op[nopnds++] = build_pointer_type (vector_quad_type_node); > > + op[nopnds++] = build_pointer_type (build_qualified_type > > + (vector_quad_type_node, > > + TYPE_QUAL_CONST)); > > Nit: Maybe we can build them out of the loop once and then just use the > built one in the loop. Or as globals even. Currently we have X and pointer to X, but no pointer to const X (and no const X either, but that isn't so useful). The generic code doesn't have this either, hrm. (snip) > Simply testing __builtin_mma_xxmtacc and __builtin_mma_xxmfacc as below: > > $ cat test.C > void foo0(const __vector_quad *acc) { > __builtin_mma_xxmtacc(acc); > __builtin_mma_xxmfacc(acc); > } > > test.C:2:25: error: invalid conversion from ‘const __vector_quad*’ to > ‘__vector_quad*’ [-fpermissive] > 2 | __builtin_mma_xxmtacc(acc); > > test.C:3:25: error: invalid conversion from ‘const __vector_quad*’ to > ‘__vector_quad*’ [-fpermissive] > 3 | __builtin_mma_xxmfacc(acc); > > They also suffered the same error on gcc11 branch but not on trunk. Yeah, there is more to be done here. > Besides, I'm not sure if the existing bif declarations using > ptr_vector_pair_type_node > and ptr_vector_quad_type_node are all intentional, at least it looks weird to > me that > we declare const __vector_pair* for this __builtin_vsx_stxvp, which is meant > to store 32 > bytes into the memory provided by the pointer biasing the sizetype offset, > but the "const" > qualifier seems to tell that this bif doesn't modify the memory pointed by > the given pointer. That looks like a bug. Well it is one even. Is it fixed on trunk? Since the patch is a strict improvement already, it is okay for 11 and 10. But you (Peter) may want to flesh it out a bit first? Or first commit only this if that works better for you. Segher