c++: Support target-specific nodes when streaming modules [PR111224]
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++/98688 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. * g++.dg/modules/target-powerpc-2_a.C: New test. * g++.dg/modules/target-powerpc-2_b.C: New test. Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com> Reviewed-by: Patrick Palka <ppalka@redhat.com>
This commit is contained in:
parent
ad860cc27b
commit
4aa87b8560
7 changed files with 101 additions and 10 deletions
|
@ -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);
|
||||
|
|
17
gcc/testsuite/g++.dg/modules/target-aarch64-1_a.C
Normal file
17
gcc/testsuite/g++.dg/modules/target-aarch64-1_a.C
Normal file
|
@ -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);
|
||||
}
|
13
gcc/testsuite/g++.dg/modules/target-aarch64-1_b.C
Normal file
13
gcc/testsuite/g++.dg/modules/target-aarch64-1_b.C
Normal file
|
@ -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);
|
||||
}
|
7
gcc/testsuite/g++.dg/modules/target-powerpc-1_a.C
Normal file
7
gcc/testsuite/g++.dg/modules/target-powerpc-1_a.C
Normal file
|
@ -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;
|
10
gcc/testsuite/g++.dg/modules/target-powerpc-1_b.C
Normal file
10
gcc/testsuite/g++.dg/modules/target-powerpc-1_b.C
Normal file
|
@ -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;
|
||||
}
|
20
gcc/testsuite/g++.dg/modules/target-powerpc-2_a.C
Normal file
20
gcc/testsuite/g++.dg/modules/target-powerpc-2_a.C
Normal file
|
@ -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;
|
||||
}
|
12
gcc/testsuite/g++.dg/modules/target-powerpc-2_b.C
Normal file
12
gcc/testsuite/g++.dg/modules/target-powerpc-2_b.C
Normal file
|
@ -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);
|
||||
}
|
Loading…
Add table
Reference in a new issue