i386: Fix up ICE with -mveclibabi={acml,svml} [PR105367]
authorJakub Jelinek <jakub@redhat.com>
Tue, 26 Apr 2022 07:40:03 +0000 (09:40 +0200)
committerJakub Jelinek <jakub@redhat.com>
Tue, 26 Apr 2022 07:40:03 +0000 (09:40 +0200)
The following testcase ICEs, because conversion between scalar float types
which have the same mode are useless in GIMPLE, but for mathfn_built_in the
exact type matters (it treats say double and _Float64 or float and _Float32
differently, using different suffixes and for the _Float* sometimes
returning NULL when float/double do have a builtin).

In ix86_veclibabi_{svml,acml} we are using mathfn_built_in just so that
we don't have to translate the combined_fn and SFmode vs. DFmode into
strings ourselfs, and we already earlier punt on anything but SFmode and
DFmode.  So, this patch just uses the double or float types depending
on the modes, rather than the types we actually got and which might be
_Float64 or _Float32 etc.

2022-04-26  Jakub Jelinek  <jakub@redhat.com>

PR target/105367
* config/i386/i386.cc (ix86_veclibabi_svml, ix86_veclibabi_acml): Pass
el_mode == DFmode ? double_type_node : float_type_node instead of
TREE_TYPE (type_in) as first arguments to mathfn_built_in.

* gcc.target/i386/pr105367.c: New test.

gcc/config/i386/i386.cc
gcc/testsuite/gcc.target/i386/pr105367.c [new file with mode: 0644]

index 8d8b094..52040da 100644 (file)
@@ -18807,7 +18807,8 @@ ix86_veclibabi_svml (combined_fn fn, tree type_out, tree type_in)
       return NULL_TREE;
     }
 
-  tree fndecl = mathfn_built_in (TREE_TYPE (type_in), fn);
+  tree fndecl = mathfn_built_in (el_mode == DFmode
+                                ? double_type_node : float_type_node, fn);
   bname = IDENTIFIER_POINTER (DECL_NAME (fndecl));
 
   if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_LOGF)
@@ -18899,7 +18900,8 @@ ix86_veclibabi_acml (combined_fn fn, tree type_out, tree type_in)
       return NULL_TREE;
     }
 
-  tree fndecl = mathfn_built_in (TREE_TYPE (type_in), fn);
+  tree fndecl = mathfn_built_in (el_mode == DFmode
+                                ? double_type_node : float_type_node, fn);
   bname = IDENTIFIER_POINTER (DECL_NAME (fndecl));
   sprintf (name + 7, "%s", bname+10);
 
diff --git a/gcc/testsuite/gcc.target/i386/pr105367.c b/gcc/testsuite/gcc.target/i386/pr105367.c
new file mode 100644 (file)
index 0000000..558e3e5
--- /dev/null
@@ -0,0 +1,12 @@
+/* PR target/105367 */
+/* { dg-do compile } */
+/* { dg-options "-Ofast -mveclibabi=acml" } */
+
+_Float64 g;
+
+void
+foo (void)
+{
+  _Float64 f = __builtin_sin (g);
+  g = __builtin_fmax (__builtin_sin (f), f);
+}