[AArch64][11/14] Re-layout SIMD builtin types on builtin expansion
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>
Tue, 4 Aug 2015 10:39:42 +0000 (10:39 +0000)
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>
Tue, 4 Aug 2015 10:39:42 +0000 (10:39 +0000)
* config/aarch64/aarch64.c (aarch64_option_valid_attribute_p):
Initialize simd builtins if TARGET_SIMD.
* config/aarch64/aarch64-builtins.c (aarch64_init_simd_builtins):
Make sure that the builtins are initialized only once no matter how
many times the function is called.
(aarch64_init_builtins): Unconditionally initialize crc builtins.
(aarch64_relayout_simd_param): New function.
(aarch64_simd_expand_args): Use above during argument expansion.
* config/aarch64/aarch64-c.c (aarch64_pragma_target_parse): Initialize
simd builtins if TARGET_SIMD.
* config/aarch64/aarch64-protos.h (aarch64_init_simd_builtins): New
prototype.
(aarch64_relayout_simd_types): Likewise.

* gcc.target/aarch64/target_attr_crypto_ice_1.c: New test.

From-SVN: r226564

gcc/ChangeLog
gcc/config/aarch64/aarch64-builtins.c
gcc/config/aarch64/aarch64-c.c
gcc/config/aarch64/aarch64-protos.h
gcc/config/aarch64/aarch64.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/aarch64/target_attr_crypto_ice_1.c [new file with mode: 0644]

index 5a5ba6ec23dc2a07c844ec38dbbaa1048e5ff2f8..fb8cbe114f48fd10110d1b6b418315c8940d1607 100644 (file)
@@ -1,3 +1,19 @@
+2015-08-04  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       * config/aarch64/aarch64.c (aarch64_option_valid_attribute_p):
+       Initialize simd builtins if TARGET_SIMD.
+       * config/aarch64/aarch64-builtins.c (aarch64_init_simd_builtins):
+       Make sure that the builtins are initialized only once no matter how
+       many times the function is called.
+       (aarch64_init_builtins): Unconditionally initialize crc builtins.
+       (aarch64_relayout_simd_param): New function.
+       (aarch64_simd_expand_args): Use above during argument expansion.
+       * config/aarch64/aarch64-c.c (aarch64_pragma_target_parse): Initialize
+       simd builtins if TARGET_SIMD.
+       * config/aarch64/aarch64-protos.h (aarch64_init_simd_builtins): New
+       prototype.
+       (aarch64_relayout_simd_types): Likewise.
+
 2015-08-04  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        * config.gcc (aarch64*-*-*): Specify c_target_objs and cxx_target_objs.
index 800f6e1ffcd358aa22ceecbc460bc1dcac4acd9e..0f4f2b97022cf029aaeb43a609ae69a30373915a 100644 (file)
@@ -684,11 +684,18 @@ aarch64_init_simd_builtin_scalar_types (void)
                                             "__builtin_aarch64_simd_udi");
 }
 
-static void
+static bool aarch64_simd_builtins_initialized_p = false;
+
+void
 aarch64_init_simd_builtins (void)
 {
   unsigned int i, fcode = AARCH64_SIMD_PATTERN_START;
 
+  if (aarch64_simd_builtins_initialized_p)
+    return;
+
+  aarch64_simd_builtins_initialized_p = true;
+
   aarch64_init_simd_builtin_types ();
 
   /* Strong-typing hasn't been implemented for all AdvSIMD builtin intrinsics.
@@ -857,8 +864,8 @@ aarch64_init_builtins (void)
 
   if (TARGET_SIMD)
     aarch64_init_simd_builtins ();
-  if (TARGET_CRC32)
-    aarch64_init_crc32_builtins ();
+
+  aarch64_init_crc32_builtins ();
 }
 
 tree
@@ -879,6 +886,31 @@ typedef enum
   SIMD_ARG_STOP
 } builtin_simd_arg;
 
+/* Relayout the decl of a function arg.  Keep the RTL component the same,
+   as varasm.c ICEs.  It doesn't like reinitializing the RTL
+   on PARM decls.  Something like this needs to be done when compiling a
+   file without SIMD and then tagging a function with +simd and using SIMD
+   intrinsics in there.  The types will have been laid out assuming no SIMD,
+   so we want to re-lay them out.  */
+
+static void
+aarch64_relayout_simd_param (tree arg)
+{
+  tree argdecl = arg;
+  if (TREE_CODE (argdecl) == SSA_NAME)
+    argdecl = SSA_NAME_VAR (argdecl);
+
+  if (argdecl
+      && (TREE_CODE (argdecl) == PARM_DECL
+         || TREE_CODE (argdecl) == VAR_DECL))
+    {
+      rtx rtl = NULL_RTX;
+      rtl = DECL_RTL_IF_SET (argdecl);
+      relayout_decl (argdecl);
+      SET_DECL_RTL (argdecl, rtl);
+    }
+}
+
 static rtx
 aarch64_simd_expand_args (rtx target, int icode, int have_retval,
                          tree exp, builtin_simd_arg *args,
@@ -908,6 +940,7 @@ aarch64_simd_expand_args (rtx target, int icode, int have_retval,
        {
          tree arg = CALL_EXPR_ARG (exp, opc - have_retval);
          enum machine_mode mode = insn_data[icode].operand[opc].mode;
+         aarch64_relayout_simd_param (arg);
          op[opc] = expand_normal (arg);
 
          switch (thisarg)
index 45da70f37331ef5a0d94ec24a74cabde791d3d07..303025f77f01e2c7632505bbf5590da0dbb6eb53 100644 (file)
@@ -177,6 +177,19 @@ aarch64_pragma_target_parse (tree args, tree pop_target)
 
   cpp_opts->warn_unused_macros = saved_warn_unused_macros;
 
+  /* Initialize SIMD builtins if we haven't already.
+     Set current_target_pragma to NULL for the duration so that
+     the builtin initialization code doesn't try to tag the functions
+     being built with the attributes specified by any current pragma, thus
+     going into an infinite recursion.  */
+  if (TARGET_SIMD)
+    {
+      tree saved_current_target_pragma = current_target_pragma;
+      current_target_pragma = NULL;
+      aarch64_init_simd_builtins ();
+      current_target_pragma = saved_current_target_pragma;
+    }
+
   return true;
 }
 
index 260c824d010e884f8d681816d7be17b409c620d7..5d8902ff3276ecd03f1f8ae3eeff0751ec6c26bc 100644 (file)
@@ -323,10 +323,12 @@ void aarch64_expand_vector_init (rtx, rtx);
 void aarch64_init_cumulative_args (CUMULATIVE_ARGS *, const_tree, rtx,
                                   const_tree, unsigned);
 void aarch64_init_expanders (void);
+void aarch64_init_simd_builtins (void);
 void aarch64_print_operand (FILE *, rtx, char);
 void aarch64_print_operand_address (FILE *, rtx);
 void aarch64_emit_call_insn (rtx);
 void aarch64_register_pragmas (void);
+void aarch64_relayout_simd_types (void);
 void aarch64_reset_previous_fndecl (void);
 
 /* Initialize builtins for SIMD intrinsics.  */
index 50934fe57ea28b14d762d22a0b05edec682b31b0..63b49ab172111838e4e75744841a9ae3cd365160 100644 (file)
@@ -8450,6 +8450,18 @@ aarch64_option_valid_attribute_p (tree fndecl, tree, tree args, int)
   if (ret)
     {
       aarch64_override_options_internal (&global_options);
+      /* Initialize SIMD builtins if we haven't already.
+        Set current_target_pragma to NULL for the duration so that
+        the builtin initialization code doesn't try to tag the functions
+        being built with the attributes specified by any current pragma, thus
+        going into an infinite recursion.  */
+      if (TARGET_SIMD)
+       {
+         tree saved_current_target_pragma = current_target_pragma;
+         current_target_pragma = NULL;
+         aarch64_init_simd_builtins ();
+         current_target_pragma = saved_current_target_pragma;
+       }
       new_target = build_target_option_node (&global_options);
     }
   else
index ff0281b924d398eb9abc2b5ae47ac76b14f8f5a1..244ed9602b78e773fec73ab660fd040c6911e971 100644 (file)
@@ -1,3 +1,7 @@
+2015-08-04  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       * gcc.target/aarch64/target_attr_crypto_ice_1.c: New test.
+
 2015-08-04  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        * gcc.target/aarch64/arm_neon-nosimd-error.c: Delete.
diff --git a/gcc/testsuite/gcc.target/aarch64/target_attr_crypto_ice_1.c b/gcc/testsuite/gcc.target/aarch64/target_attr_crypto_ice_1.c
new file mode 100644 (file)
index 0000000..42f14c4
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mcpu=thunderx+nofp" } */
+
+#include "arm_neon.h"
+
+/* Unless we do something about re-laying out the SIMD builtin types
+   this testcase ICEs during expansion of the crypto builtin.  */
+
+__attribute__ ((target ("cpu=cortex-a57+crypto")))
+uint32x4_t
+test_vsha1cq_u32 (uint32x4_t hash_abcd, uint32_t hash_e, uint32x4_t wk)
+{
+  return vsha1cq_u32 (hash_abcd, hash_e, wk);
+}
+
+/* This one should be compiled for thunderx with no fp.  */
+int
+foo (int a)
+{
+  return a + 5;
+}