On Tue, 12 Mar 2024, Nathaniel Shead wrote: > On Tue, Mar 12, 2024 at 11:11:40PM +1100, Nathaniel Shead wrote: > > On Mon, Mar 11, 2024 at 10:36:06AM -0400, Patrick Palka wrote: > > > On Sun, 10 Mar 2024, Nathaniel Shead wrote: > > > > > > > Bootstrapped and regtested on x86_64-pc-linux-gnu and > > > > aarch64-unknown-linux-gnu, OK for trunk? > > > > > > > > It's worth noting that the AArch64 machines I had available to test with > > > > didn't have a new enough glibc to reproduce the ICEs in the PR, but this > > > > patch will be necessary (albeit possibly not sufficient) to fix it. > > > > > > > > -- >8 -- > > > > > > > > Some targets make use of POLY_INT_CSTs and other custom builtin types, > > > > which currently violate some assumptions when streaming. This patch adds > > > > support for them, specifically AArch64 SVE types like __fp16. > > > > > > It seems other built-in types are handled by adding them to the > > > fixed_trees vector in init_modules (and then we install them first > > > during streaming). Could we just add all the target-specific types to > > > fixed_trees too? > > > > > > > Yes, that works too. Seems cleaner as well, though I had to add it as a > > separate loop because the set of builtin types registered is not > > determined until runtiem (depending on e.g. ABI flags). I also noticed > > that this fixes another PR, on PowerPC, so I've added a test for it. > > Thanks! > > > > Bootstrapped and regtested on x86_64-pc-linux-gnu, > > aarch64-unknown-linux-gnu, and powerpc64le-unknown-linux-gnu; > > OK for trunk? > > > > -- >8 -- > > > > Some targets make use of POLY_INT_CSTs and other custom builtin types, > > which currently violate some assumptions when streaming. This patch adds > > support for them, such as types like Aarch64 __fp16, PowerPC __ibm128, > > and vector types thereof. > > > > This patch doesn't provide "full" support of AArch64 SVE, however, since > > for that we would need to support 'target' nodes (tracked in PR108080). > > > > Adding the new builtin types means that on Aarch64 we now have 217 > > global trees created on initialisation (up from 191), so this patch also > > slightly bumps the initial size of the fixed_trees allocation to 250. > > > > PR c++/98645 > > PR c++/111224 > > > > gcc/cp/ChangeLog: > > > > * module.cc (enum tree_tag): Add new tag for builtin types. > > (trees_out::start): POLY_INT_CSTs can be emitted. > > (trees_in::start): Likewise. > > (trees_out::core_vals): Stream POLY_INT_CSTs. > > (trees_in::core_vals): Likewise. > > (trees_out::type_node): Handle vectors with multiple coeffs. > > (trees_in::tree_node): Likewise. > > (init_modules): Register target-specific builtin types. Bump > > initial capacity slightly. > > > > gcc/testsuite/ChangeLog: > > > > * g++.dg/modules/target-aarch64-1_a.C: New test. > > * g++.dg/modules/target-aarch64-1_b.C: New test. > > * g++.dg/modules/target-powerpc-1_a.C: New test. > > * g++.dg/modules/target-powerpc-1_b.C: New test. > > > > Signed-off-by: Nathaniel Shead <nathanielosh...@gmail.com> > > Reviewed-by: Patrick Palka <ppa...@redhat.com> > > --- > > gcc/cp/module.cc | 32 +++++++++++++------ > > .../g++.dg/modules/target-aarch64-1_a.C | 17 ++++++++++ > > .../g++.dg/modules/target-aarch64-1_b.C | 13 ++++++++ > > .../g++.dg/modules/target-powerpc-1_a.C | 7 ++++ > > .../g++.dg/modules/target-powerpc-1_b.C | 10 ++++++ > > 5 files changed, 69 insertions(+), 10 deletions(-) > > create mode 100644 gcc/testsuite/g++.dg/modules/target-aarch64-1_a.C > > create mode 100644 gcc/testsuite/g++.dg/modules/target-aarch64-1_b.C > > create mode 100644 gcc/testsuite/g++.dg/modules/target-powerpc-1_a.C > > create mode 100644 gcc/testsuite/g++.dg/modules/target-powerpc-1_b.C > > > > diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc > > index 99055523d91..8aab9ea0bae 100644 > > --- a/gcc/cp/module.cc > > +++ b/gcc/cp/module.cc > > @@ -5173,7 +5173,6 @@ trees_out::start (tree t, bool code_streamed) > > break; > > > > case FIXED_CST: > > - case POLY_INT_CST: > > gcc_unreachable (); /* Not supported in C++. */ > > break; > > > > @@ -5259,7 +5258,6 @@ trees_in::start (unsigned code) > > > > case FIXED_CST: > > case IDENTIFIER_NODE: > > - case POLY_INT_CST: > > case SSA_NAME: > > case TARGET_MEM_REF: > > case TRANSLATION_UNIT_DECL: > > @@ -6106,7 +6104,10 @@ trees_out::core_vals (tree t) > > break; > > > > case POLY_INT_CST: > > - gcc_unreachable (); /* Not supported in C++. */ > > + if (streaming_p ()) > > + for (unsigned ix = 0; ix != NUM_POLY_INT_COEFFS; ix++) > > + WT (POLY_INT_CST_COEFF (t, ix)); > > + break; > > > > case REAL_CST: > > if (streaming_p ()) > > @@ -6615,8 +6616,9 @@ trees_in::core_vals (tree t) > > break; > > > > case POLY_INT_CST: > > - /* Not suported in C++. */ > > - return false; > > + for (unsigned ix = 0; ix != NUM_POLY_INT_COEFFS; ix++) > > + RT (POLY_INT_CST_COEFF (t, ix)); > > + break; > > > > case REAL_CST: > > if (const void *bytes = buf (sizeof (real_value))) > > @@ -9068,8 +9070,8 @@ trees_out::type_node (tree type) > > if (streaming_p ()) > > { > > poly_uint64 nunits = TYPE_VECTOR_SUBPARTS (type); > > - /* to_constant asserts that only coeff[0] is of interest. */ > > - wu (static_cast<unsigned HOST_WIDE_INT> (nunits.to_constant ())); > > + for (unsigned ix = 0; ix != NUM_POLY_INT_COEFFS; ix++) > > + wu (nunits.coeffs[ix]); > > } > > break; > > } > > @@ -9630,9 +9632,11 @@ trees_in::tree_node (bool is_use) > > > > case VECTOR_TYPE: > > { > > - unsigned HOST_WIDE_INT nunits = wu (); > > + poly_uint64 nunits; > > + for (unsigned ix = 0; ix != NUM_POLY_INT_COEFFS; ix++) > > + nunits.coeffs[ix] = wu (); > > if (!get_overrun ()) > > - res = build_vector_type (res, static_cast<poly_int64> (nunits)); > > + res = build_vector_type (res, nunits); > > } > > break; > > } > > @@ -20151,7 +20155,7 @@ init_modules (cpp_reader *reader) > > some global trees are lazily created and we don't want that to > > mess with our syndrome of fixed trees. */ > > unsigned crc = 0; > > - vec_alloc (fixed_trees, 200); > > + vec_alloc (fixed_trees, 250); > > > > dump () && dump ("+Creating globals"); > > /* Insert the TRANSLATION_UNIT_DECL. */ > > @@ -20169,6 +20173,14 @@ init_modules (cpp_reader *reader) > > dump () && dump ("+%u", v); > > } > > } > > + /* OS- and machine-specific types are dynamically registered at > > + runtime, so cannot be part of global_tree_arys. */ > > + registered_builtin_types && dump ("") && dump ("+\tB:"); > > + for (tree t = registered_builtin_types; t; t = TREE_CHAIN (t)) > > + { > > + unsigned v = maybe_add_global (TREE_VALUE (t), crc); > > + dump () && dump ("+%u", v); > > + } > > global_crc = crc32_unsigned (crc, fixed_trees->length ()); > > dump ("") && dump ("Created %u unique globals, crc=%x", > > fixed_trees->length (), global_crc); > > diff --git a/gcc/testsuite/g++.dg/modules/target-aarch64-1_a.C > > b/gcc/testsuite/g++.dg/modules/target-aarch64-1_a.C > > new file mode 100644 > > index 00000000000..6c699053cdc > > --- /dev/null > > +++ b/gcc/testsuite/g++.dg/modules/target-aarch64-1_a.C > > @@ -0,0 +1,17 @@ > > +// PR c++/111224 > > +// { dg-do compile { target aarch64*-*-* } } > > +// { dg-require-effective-target aarch64_asm_sve_ok } > > +// { dg-additional-options "-fmodules-ts -march=armv8.2-a+sve" } > > + > > +module; > > + > > +// We can't do a header unit of this right now because this > > +// uses target attributes, that we don't yet support. > > +// See also PR c++/108080. > > +#include <arm_sve.h> > > + > > +export module M; > > + > > +export inline void foo(svbool_t x, svfloat16_t f) { > > + svabs_f16_x(x, f); > > +} > > diff --git a/gcc/testsuite/g++.dg/modules/target-aarch64-1_b.C > > b/gcc/testsuite/g++.dg/modules/target-aarch64-1_b.C > > new file mode 100644 > > index 00000000000..c18691dcf8a > > --- /dev/null > > +++ b/gcc/testsuite/g++.dg/modules/target-aarch64-1_b.C > > @@ -0,0 +1,13 @@ > > +// PR c++/111224 > > +// { dg-module-do link { target aarch64*-*-* } } > > +// { dg-require-effective-target aarch64_asm_sve_ok } > > +// { dg-additional-options "-fmodules-ts -fno-module-lazy > > -march=armv8.2-a+sve" } > > + > > +#include <arm_sve.h> > > +import M; > > + > > +int main() { > > + svbool_t x = svptrue_b8 (); > > + svfloat16_t f = svdup_n_f16(1.0); > > + foo(x, f); > > +} > > diff --git a/gcc/testsuite/g++.dg/modules/target-powerpc-1_a.C > > b/gcc/testsuite/g++.dg/modules/target-powerpc-1_a.C > > new file mode 100644 > > index 00000000000..693ed101ed5 > > --- /dev/null > > +++ b/gcc/testsuite/g++.dg/modules/target-powerpc-1_a.C > > @@ -0,0 +1,7 @@ > > +// PR c++/98645 > > +// { dg-do compile { target powerpc*-*-* } } > > +// { dg-require-effective-target ppc_float128_sw } > > +// { dg-additional-options "-fmodules-ts -mfloat128 -mabi=ieeelongdouble" } > > + > > +export module M; > > +export __ibm128 i = 0.0; > > diff --git a/gcc/testsuite/g++.dg/modules/target-powerpc-1_b.C > > b/gcc/testsuite/g++.dg/modules/target-powerpc-1_b.C > > new file mode 100644 > > index 00000000000..d6b684b556d > > --- /dev/null > > +++ b/gcc/testsuite/g++.dg/modules/target-powerpc-1_b.C > > @@ -0,0 +1,10 @@ > > +// PR c++/98645 > > +// { dg-module-do compile { target powerpc*-*-* } } > > +// { dg-require-effective-target ppc_float128_sw } > > +// { dg-additional-options "-fmodules-ts -mfloat128 -mabi=ieeelongdouble" } > > + > > +import M; > > + > > +int main() { > > + __ibm128 j = i; > > +} > > -- > > 2.43.2 > > > > Actually just noticed another PR this also seems to fix, PR c++/98688; > here are another two testcases I'll include in the above patch:
Sweet! LGTM > > diff --git a/gcc/testsuite/g++.dg/modules/target-powerpc-2_a.C > b/gcc/testsuite/g++.dg/modules/target-powerpc-2_a.C > new file mode 100644 > index 00000000000..cc18862e55c > --- /dev/null > +++ b/gcc/testsuite/g++.dg/modules/target-powerpc-2_a.C > @@ -0,0 +1,20 @@ > +// PR c++/98688 > +// { dg-do compile { target powerpc*-*-* } } > +// { dg-additional-options "-fmodules-ts -mcpu=power10 -mmma" } > + > +export module mma_foo0; > + > +typedef unsigned char vec_t __attribute__((vector_size(16))); > + > +export void > +foo0 (__vector_quad *dst, vec_t *vec, __vector_pair *pvecp) > +{ > + __vector_quad acc; > + __vector_pair vecp0 = *pvecp; > + vec_t vec1 = vec[1]; > + > + __builtin_mma_xvf64ger (&acc, vecp0, vec1); > + __builtin_mma_xvf64gerpp (&acc, vecp0, vec1); > + __builtin_mma_xvf64gerpn (&acc, vecp0, vec1); > + dst[0] = acc; > +} > diff --git a/gcc/testsuite/g++.dg/modules/target-powerpc-2_b.C > b/gcc/testsuite/g++.dg/modules/target-powerpc-2_b.C > new file mode 100644 > index 00000000000..9e77ba7afca > --- /dev/null > +++ b/gcc/testsuite/g++.dg/modules/target-powerpc-2_b.C > @@ -0,0 +1,12 @@ > +// PR c++/98688 > +// { dg-module-do compile { target powerpc*-*-* } } > +// { dg-additional-options "-fmodules-ts -mcpu=power10 -mmma" } > + > +import mma_foo0; > + > +typedef unsigned char vec_t __attribute__((vector_size(16))); > + > +void bar(__vector_quad *dst, vec_t *vec, __vector_pair *pvecp) > +{ > + foo0 (dst, vec, pvecp); > +} > -- > 2.43.2 > >