aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/i386
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2022-10-19 11:22:53 +0200
committerJakub Jelinek <jakub@redhat.com>2022-10-19 11:22:53 +0200
commit8f7df3338c16471a38784983531e57aa2dba1d03 (patch)
tree043463332380c54d652d5697ccf8c7d1746f46b5 /gcc/config/i386
parent32ab9238d86dfa6d74d3592bec570f4f257d0413 (diff)
downloadgcc-8f7df3338c16471a38784983531e57aa2dba1d03.zip
gcc-8f7df3338c16471a38784983531e57aa2dba1d03.tar.gz
gcc-8f7df3338c16471a38784983531e57aa2dba1d03.tar.bz2
i386: Fix up __bf16 handling on ia32
Last night's testing of the libstdc++ changes revealed a problem in the __bf16 backend registration (while _Float16 seems ok). The problem is that for both BFmode and HFmode we require TARGET_SSE2, the generic code creates {,b}float16_type_node only if that is true at the start of the TU and the builtins for the type are only created in that case (many __builtin_*f16 for HFmode and __builtin_nansf16b for BFmode). Now, for _Float16 I've kept what the code did previously, if float16_type_node from generic code is NULL, create ix86_float16_type_node and register _Float16 for it, but for __bf16 I've changed it so that if bfloat16_type_node from generic code is NULL, ix86_register_bf16_builtin_type makes bfloat16_type_node non-NULL. This has an unfortunate consequence though, __STDCPP_BFLOAT16_T__ is predefined for C++23, __BFLT16_*__ macros are predefined as well, but the type doesn't really work (errors whenever it is used) and the builtin isn't defined. The following patch fixes that by going with what we do for HFmode, bfloat16_type_node stays as initialized by generic code and we have a local type for backend use. On the other side, nothing used ix86_bf16_ptr_type_node so that is now dropped. 2022-10-19 Jakub Jelinek <jakub@redhat.com> * config/i386/i386-builtins.cc (ix86_bf16_ptr_type_node): Remove. (ix86_bf16_type_node): New variable. (ix86_register_bf16_builtin_type): If bfloat16_type_node is NULL from generic code, set only ix86_bf16_type_node to a new REAL_TYPE rather than bfloat16_type_node, otherwise set ix86_bf16_type_node to bfloat16_type_node. Register __bf16 on ix86_bf16_type_node rather than bfloat16_type_node. Don't initialize unused ix86_bf16_ptr_type_node. * config/i386/i386-builtin-types.def (BFLOAT16): Use ix86_bf16_type_node rather than bfloat16_type_node.
Diffstat (limited to 'gcc/config/i386')
-rw-r--r--gcc/config/i386/i386-builtin-types.def2
-rw-r--r--gcc/config/i386/i386-builtins.cc17
2 files changed, 9 insertions, 10 deletions
diff --git a/gcc/config/i386/i386-builtin-types.def b/gcc/config/i386/i386-builtin-types.def
index 2c27a4e..63a360b 100644
--- a/gcc/config/i386/i386-builtin-types.def
+++ b/gcc/config/i386/i386-builtin-types.def
@@ -69,7 +69,7 @@ DEF_PRIMITIVE_TYPE (UINT16, short_unsigned_type_node)
DEF_PRIMITIVE_TYPE (INT64, long_long_integer_type_node)
DEF_PRIMITIVE_TYPE (UINT64, long_long_unsigned_type_node)
DEF_PRIMITIVE_TYPE (FLOAT16, ix86_float16_type_node)
-DEF_PRIMITIVE_TYPE (BFLOAT16, bfloat16_type_node)
+DEF_PRIMITIVE_TYPE (BFLOAT16, ix86_bf16_type_node)
DEF_PRIMITIVE_TYPE (FLOAT, float_type_node)
DEF_PRIMITIVE_TYPE (DOUBLE, double_type_node)
DEF_PRIMITIVE_TYPE (FLOAT80, float80_type_node)
diff --git a/gcc/config/i386/i386-builtins.cc b/gcc/config/i386/i386-builtins.cc
index b5c651a..76668cc 100644
--- a/gcc/config/i386/i386-builtins.cc
+++ b/gcc/config/i386/i386-builtins.cc
@@ -126,7 +126,7 @@ BDESC_VERIFYS (IX86_BUILTIN_MAX,
static GTY(()) tree ix86_builtin_type_tab[(int) IX86_BT_LAST_CPTR + 1];
tree ix86_float16_type_node = NULL_TREE;
-tree ix86_bf16_ptr_type_node = NULL_TREE;
+tree ix86_bf16_type_node = NULL_TREE;
/* Retrieve an element from the above table, building some of
the types lazily. */
@@ -1373,17 +1373,16 @@ ix86_register_bf16_builtin_type (void)
{
if (bfloat16_type_node == NULL_TREE)
{
- bfloat16_type_node = make_node (REAL_TYPE);
- TYPE_PRECISION (bfloat16_type_node) = 16;
- SET_TYPE_MODE (bfloat16_type_node, BFmode);
- layout_type (bfloat16_type_node);
+ ix86_bf16_type_node = make_node (REAL_TYPE);
+ TYPE_PRECISION (ix86_bf16_type_node) = 16;
+ SET_TYPE_MODE (ix86_bf16_type_node, BFmode);
+ layout_type (ix86_bf16_type_node);
}
+ else
+ ix86_bf16_type_node = bfloat16_type_node;
if (!maybe_get_identifier ("__bf16") && TARGET_SSE2)
- {
- lang_hooks.types.register_builtin_type (bfloat16_type_node, "__bf16");
- ix86_bf16_ptr_type_node = build_pointer_type (bfloat16_type_node);
- }
+ lang_hooks.types.register_builtin_type (ix86_bf16_type_node, "__bf16");
}
static void