[AArch64] Fix FAIL: gcc.target/aarch64/target_attr_crypto_ice_1.c (internal compiler...
authorktkachov <ktkachov@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 1 Sep 2015 10:32:24 +0000 (10:32 +0000)
committerktkachov <ktkachov@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 1 Sep 2015 10:32:24 +0000 (10:32 +0000)
* config/aarch64/aarch64.c (aarch64_set_current_function):
Re-layout any vector parameters have non-simd layout.
* config/aarch64/aarch64-builtins.c (aarch64_relayout_simd_param):
Delete.
(aarch64_simd_expand_args): Delete call to the above.

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

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@227363 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 2e7230b..401c0c4 100644 (file)
@@ -1,3 +1,11 @@
+2015-09-01  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       * config/aarch64/aarch64.c (aarch64_set_current_function):
+       Re-layout any vector parameters have non-simd layout.
+       * config/aarch64/aarch64-builtins.c (aarch64_relayout_simd_param):
+       Delete.
+       (aarch64_simd_expand_args): Delete call to the above.
+
 2015-08-31  Mike Frysinger  <vapier@gentoo.org>
 
        * doc/invoke.texi (asan-stack): Add space before option.
index 0f4f2b9..e3a90b5 100644 (file)
@@ -886,30 +886,6 @@ 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,
@@ -940,7 +916,6 @@ 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 ce6e116..bc612e4 100644 (file)
@@ -8111,6 +8111,23 @@ aarch64_set_current_function (tree fndecl)
              = save_target_globals_default_opts ();
        }
     }
+
+  if (!fndecl)
+    return;
+
+  /* If we turned on SIMD make sure that any vector parameters are re-laid out
+     so that they use proper vector modes.  */
+  if (TARGET_SIMD)
+    {
+      tree parms = DECL_ARGUMENTS (fndecl);
+      for (; parms && parms != void_list_node; parms = TREE_CHAIN (parms))
+       {
+         if (TREE_CODE (parms) == PARM_DECL
+             && VECTOR_TYPE_P (TREE_TYPE (parms))
+             && DECL_MODE (parms) != TYPE_MODE (TREE_TYPE (parms)))
+           relayout_decl (parms);
+       }
+    }
 }
 
 /* Enum describing the various ways we can handle attributes.
index b9d9f84..f14ff33 100644 (file)
@@ -1,3 +1,7 @@
+2015-09-01  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       * gcc.target/aarch64/target_attr_crypto_ice_2.c: New test.
+
 2015-09-01  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/61753
diff --git a/gcc/testsuite/gcc.target/aarch64/target_attr_crypto_ice_2.c b/gcc/testsuite/gcc.target/aarch64/target_attr_crypto_ice_2.c
new file mode 100644 (file)
index 0000000..d6e7b68
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mcpu=thunderx+nofp" } */
+
+/* Make sure that we don't ICE when dealing with vector parameters
+   in a simd-tagged function within a non-simd translation unit.  */
+
+#pragma GCC push_options
+#pragma GCC target ("+nothing+simd")
+typedef unsigned int __uint32_t;
+typedef __uint32_t uint32_t ;
+typedef __Uint32x4_t uint32x4_t;
+#pragma GCC pop_options
+
+
+__attribute__ ((target ("cpu=cortex-a57")))
+uint32x4_t
+foo (uint32x4_t a, uint32_t b, uint32x4_t c)
+{
+  return c;
+}