]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Set callee_pass_avx256_p before emitting call instruction
authorH.J. Lu <hongjiu.lu@intel.com>
Fri, 22 Mar 2013 17:00:36 +0000 (17:00 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Fri, 22 Mar 2013 17:00:36 +0000 (10:00 -0700)
gcc/

PR target/56560
* config/i386/i386.c (init_cumulative_args): Also set
cum->callee_return_avx256_p.
(ix86_function_arg): Set cum->callee_pass_avx256_p.  Set
cfun->machine->callee_pass_avx256_p only when MODE == VOIDmode.

* config/i386/i386.h (ix86_args): Add callee_pass_avx256_p and
callee_return_avx256_p.

gcc/

PR target/56560
* gcc.target/i386/pr56560.c: New file.

From-SVN: r196979

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/config/i386/i386.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr56560.c [new file with mode: 0644]

index 7ad3623c2272c8b5fdfceec926d09fe83f1ff3e3..1a8f96e8480d297668e82f7b5ebbcfc55f1959d5 100644 (file)
@@ -1,3 +1,14 @@
+2013-03-22  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR target/56560
+       * config/i386/i386.c (init_cumulative_args): Also set
+       cum->callee_return_avx256_p.
+       (ix86_function_arg): Set cum->callee_pass_avx256_p.  Set
+       cfun->machine->callee_pass_avx256_p only when MODE == VOIDmode.
+
+       * config/i386/i386.h (ix86_args): Add callee_pass_avx256_p and
+       callee_return_avx256_p.
+
 2013-03-20  Jack Howarth  <howarth@bromo.med.uc.edu>
 
        PR bootstrap/56258
index 436fa4f4f9fc1dcecb37a4d08af53c0fba81f6d5..86804a472a58c7e218ef88ddaeafc6e60ba29539 100644 (file)
@@ -5938,7 +5938,10 @@ init_cumulative_args (CUMULATIVE_ARGS *cum,  /* Argument info to initialize */
        {
          /* The return value of this function uses 256bit AVX modes.  */
          if (caller)
-           cfun->machine->callee_return_avx256_p = true;
+           {
+             cfun->machine->callee_return_avx256_p = true;
+             cum->callee_return_avx256_p = true;
+           }
          else
            cfun->machine->caller_return_avx256_p = true;
        }
@@ -7206,11 +7209,20 @@ ix86_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode omode,
     {
       /* This argument uses 256bit AVX modes.  */
       if (cum->caller)
-       cfun->machine->callee_pass_avx256_p = true;
+       cum->callee_pass_avx256_p = true;
       else
        cfun->machine->caller_pass_avx256_p = true;
     }
 
+  if (cum->caller && mode == VOIDmode)
+    {
+      /* This function is called with MODE == VOIDmode immediately
+        before the call instruction is emitted.  We copy callee 256bit
+        AVX info from the current CUM here.  */
+      cfun->machine->callee_return_avx256_p = cum->callee_return_avx256_p;
+      cfun->machine->callee_pass_avx256_p = cum->callee_pass_avx256_p;
+    }
+
   return arg;
 }
 
index 281f9e1276560c3c076ae77dc26e016ccabf3f34..bb23674d789802fcecbcb429d44a90c96ca107f8 100644 (file)
@@ -1494,6 +1494,7 @@ enum reg_class
 /* 1 if N is a possible register number for function argument passing.  */
 #define FUNCTION_ARG_REGNO_P(N) ix86_function_arg_regno_p (N)
 
+#ifndef USED_FOR_TARGET
 /* Define a data type for recording info about an argument list
    during the scan of that argument list.  This data type should
    hold all necessary information about the function itself
@@ -1522,7 +1523,12 @@ typedef struct ix86_args {
                                   in SSE registers.  Otherwise 0.  */
   enum calling_abi call_abi;   /* Set to SYSV_ABI for sysv abi. Otherwise
                                   MS_ABI for ms abi.  */
+  /* Nonzero if it passes 256bit AVX modes.  */
+  BOOL_BITFIELD callee_pass_avx256_p : 1;
+  /* Nonzero if it returns 256bit AVX modes.  */
+  BOOL_BITFIELD callee_return_avx256_p : 1;
 } CUMULATIVE_ARGS;
+#endif
 
 /* Initialize a variable CUM of type CUMULATIVE_ARGS
    for a call to a function whose data type is FNTYPE.
index e6e078069c90bd6d4be489ea660917f13c56b0c0..b502eac159bdbc3b8d06151bf391fd99001e68cf 100644 (file)
@@ -1,3 +1,8 @@
+2013-03-22  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR target/56560
+       * gcc.target/i386/pr56560.c: New file.
+
 2013-03-15  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/56615
diff --git a/gcc/testsuite/gcc.target/i386/pr56560.c b/gcc/testsuite/gcc.target/i386/pr56560.c
new file mode 100644 (file)
index 0000000..5417cbd
--- /dev/null
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx -mvzeroupper -dp" } */
+
+extern void abort (void);
+
+typedef double vec_t __attribute__((vector_size(32)));
+
+struct S { int i1; int i2; int i3; };
+
+extern int bar (vec_t, int, int, int, int, int, struct S);
+
+void foo (vec_t v, struct S s)
+{
+  int i = bar (v, 1, 2, 3, 4, 5, s);
+  if (i == 0)
+    abort ();
+}
+
+/* { dg-final { scan-assembler-not "avx_vzeroupper" } } */