diff mbox

PATCH: PR target/46519: Missing vzeroupper

Message ID AANLkTimWwfA31LyrZdU86TcKokLboWPhxQXLQgr61NJ4@mail.gmail.com
State New
Headers show

Commit Message

H.J. Lu Nov. 24, 2010, 7:14 p.m. UTC
On Wed, Nov 24, 2010 at 10:53 AM, Uros Bizjak <ubizjak@gmail.com> wrote:
> On Wed, Nov 24, 2010 at 7:41 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
>
>> Here is a follow up  patch.  Fortran intrinsic may set TREE_THIS_VOLATILE
>> even if it does return. This patch removes the TREE_THIS_VOLATILE
>> optimization.  OK for trunk?
>
> Looking at the testcase, I guess it is OK. Perhaps a fortran person
> can comment from the fortran POV?
>
> Uros.
>

Fortran is OK. The problem is

if (TARGET_VZEROUPPER && !TREE_THIS_VOLATILE (cfun->decl))

Even if caller, which is MAIN__, never returns, we should issue vzeroupper
when making a library call.  I am checking this one.
diff mbox

Patch

diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 2a46f1a..582639c 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -21755,7 +21754,7 @@  ix86_expand_call (rtx retval, rtx fnaddr, rtx callarg1,
     }
 
   /* Add UNSPEC_CALL_NEEDS_VZEROUPPER decoration.  */
-  if (TARGET_VZEROUPPER && !TREE_THIS_VOLATILE (cfun->decl))
+  if (TARGET_VZEROUPPER)
     {
       rtx unspec;
       int avx256;
diff --git a/gcc/testsuite/gfortran.dg/pr46519-1.f b/gcc/testsuite/gfortran.dg/pr46519-1.f
new file mode 100644
index 0000000..7b1775e
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr46519-1.f
@@ -0,0 +1,46 @@ 
+! { dg-do compile { target i?86-*-* x86_64-*-* } }
+! { dg-options "-O3 -mavx -mvzeroupper -dp" }
+
+      PROGRAM MG3XDEMO 
+      INTEGER LM, NM, NV, NR, NIT
+
+
+      PARAMETER( LM=7 )
+C      PARAMETER( NIT=40 )
+      PARAMETER( NM=2+2**LM, NV=NM**3 )
+      PARAMETER( NR = (8*(NM**3+NM**2+5*NM-23+7*LM))/7 )
+C
+C
+C If commented line is used than there is no penalty
+C	COMMON /X/ U, V, R, A, C, IR, MM
+	COMMON /X/ A, C, IR, MM
+      REAL*8 A(0:3),C(0:3)
+
+      INTEGER IT, N
+      INTEGER LMI, MTIME, NTIMES
+C
+      READ *,LMI
+      READ *,NIT
+      READ *,NTIMES
+      READ *,U0
+
+      READ 9004, A
+      READ 9004, C
+9004  FORMAT (4D8.0)
+
+      DO I = 0, 3
+	A(I) = A(I)/3.0D0
+	C(I) = C(I)/64.0D0
+      ENDDO
+C
+      N  = 2 + 2**LMI
+
+      WRITE(6,7)N-2,N-2,N-2,NIT
+ 6    FORMAT( I4, 2E19.12)
+ 7    FORMAT(/,' KERNEL B:  SOLVING A POISSON PROBLEM ON A ',I6,' BY ',
+     > I6,' BY ',I6,' GRID,',/,' USING ',I6,' MULTIGRID ITERATIONS.',/)
+C
+      STOP
+      END
+
+! { dg-final { scan-assembler-times "avx_vzeroupper" 1 } }