From patchwork Fri Dec 17 19:03:47 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 75957 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id D79F71007D3 for ; Sat, 18 Dec 2010 06:04:14 +1100 (EST) Received: (qmail 22339 invoked by alias); 17 Dec 2010 19:03:57 -0000 Received: (qmail 22289 invoked by uid 22791); 17 Dec 2010 19:03:55 -0000 X-SWARE-Spam-Status: No, hits=-0.7 required=5.0 tests=AWL, BAYES_00, NO_DNS_FOR_FROM, SARE_OBFUFCK2, TW_AV, TW_MV, TW_VZ, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mga02.intel.com (HELO mga02.intel.com) (134.134.136.20) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 17 Dec 2010 19:03:49 +0000 Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga101.jf.intel.com with ESMTP; 17 Dec 2010 11:03:47 -0800 X-ExtLoop1: 1 Received: from gnu-6.sc.intel.com ([10.3.194.135]) by orsmga002.jf.intel.com with ESMTP; 17 Dec 2010 11:03:47 -0800 Received: by gnu-6.sc.intel.com (Postfix, from userid 500) id 49DFE180A62; Fri, 17 Dec 2010 11:03:47 -0800 (PST) Date: Fri, 17 Dec 2010 11:03:47 -0800 From: "H.J. Lu" To: gcc-patches@gcc.gnu.org Cc: Uros Bizjak Subject: PATCH: PR target/46519: Missing vzeroupper Message-ID: <20101217190347.GA2856@intel.com> Reply-To: "H.J. Lu" MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Hi, This patch fixes another missing vzeroupper. OK for trunk? Thanks. H.J. --- gcc/ 2010-12-17 H.J. Lu PR target/46519 * config/i386/i386.c (rescan_move_or_delete_vzeroupper): Stop rescanning predecessor edges if one of them uses upper 128bits. gcc/testsuite/ 2010-12-17 H.J. Lu PR target/46519 * gfortran.dg/pr46519-2.f90: New. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index a5603e6..99ba823 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -349,7 +349,10 @@ rescan_move_or_delete_vzeroupper (basic_block block) rescan_move_or_delete_vzeroupper (e->src); /* For rescan, UKKNOWN state is treated as UNUSED. */ if (BLOCK_INFO (e->src)->state == used) - state = used; + { + state = used; + break; + } } /* Rescan this block only if there are vzerouppers or the upper diff --git a/gcc/testsuite/gfortran.dg/pr46519-2.f90 b/gcc/testsuite/gfortran.dg/pr46519-2.f90 new file mode 100644 index 0000000..b4d6980 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr46519-2.f90 @@ -0,0 +1,31 @@ +! { dg-do compile { target i?86-*-* x86_64-*-* } } +! { dg-options "-O3 -mavx -mvzeroupper -mtune=generic -dp" } + + SUBROUTINE func(kts, kte, qrz, qiz, rho) + IMPLICIT NONE + INTEGER, INTENT(IN) :: kts, kte + REAL, DIMENSION(kts:kte), INTENT(INOUT) :: qrz, qiz, rho + INTEGER :: k + REAL, DIMENSION(kts:kte) :: praci, vtiold + REAL :: fluxout + INTEGER :: min_q, max_q, var + do k=kts,kte + praci(k)=0.0 + enddo + min_q=kte + max_q=kts-1 + DO var=1,20 + do k=max_q,min_q,-1 + fluxout=rho(k)*qrz(k) + enddo + qrz(min_q-1)=qrz(min_q-1)+fluxout + ENDDO + DO var=1,20 + do k=kts,kte-1 + vtiold(k)= (rho(k))**0.16 + enddo + ENDDO + STOP + END SUBROUTINE func + +! { dg-final { scan-assembler "avx_vzeroupper" } }