From patchwork Wed Nov 7 12:19:07 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Uros Bizjak X-Patchwork-Id: 197651 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 4735E2C00AE for ; Wed, 7 Nov 2012 23:19:23 +1100 (EST) Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=gcc.gnu.org; s=default; x=1352895564; h=Comment: DomainKey-Signature:Received:Received:Received:Received: MIME-Version:Received:Received:In-Reply-To:References:Date: Message-ID:Subject:From:To:Cc:Content-Type:Mailing-List: Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:Sender:Delivered-To; bh=f6FbHBtGX9ZpCtiH4eNMGA0GqVc=; b=BRby6pmmSnh4ptSRmCFy2sEIp3r+MHPTlc2bpANJ1aB2VaEpax/BBnfW+EXHE2 rZm5UYBYkEC+ZlcxXRcGMDeX72cxUeIOxScvMuh+Wh16RdQr3R6/dtBBk5CmlheD BxAKamOljVnSQ2+S61S5gQ918wCkWV2M6vF9bmhikqmWA= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=gcc.gnu.org; h=Received:Received:X-SWARE-Spam-Status:X-Spam-Check-By:Received:Received:MIME-Version:Received:Received:In-Reply-To:References:Date:Message-ID:Subject:From:To:Cc:Content-Type:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=RZwL8fuPAMaB0eILtDK5tqPzY4BzTgm/sUvxE4Do+DPTy/CVjsfEig4xYsj11u qT1zFxLCkxpNnsecxDT5WIFu1N8/W5wiH1MoRyUEpWdAFkY/ybZtWwg+OVTXlyjU PKjMKb9naB+uUDpm0IqdSW25hmNIRaILoFBeG6jhlxFXI=; Received: (qmail 22909 invoked by alias); 7 Nov 2012 12:19:14 -0000 Received: (qmail 22895 invoked by uid 22791); 7 Nov 2012 12:19:12 -0000 X-SWARE-Spam-Status: No, hits=-4.9 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, KHOP_RCVD_TRUST, KHOP_THREADED, RCVD_IN_DNSWL_LOW, RCVD_IN_HOSTKARMA_YE, TW_AV, TW_VB, TW_VZ, TW_ZJ X-Spam-Check-By: sourceware.org Received: from mail-da0-f47.google.com (HELO mail-da0-f47.google.com) (209.85.210.47) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 07 Nov 2012 12:19:08 +0000 Received: by mail-da0-f47.google.com with SMTP id s35so634301dak.20 for ; Wed, 07 Nov 2012 04:19:07 -0800 (PST) MIME-Version: 1.0 Received: by 10.68.224.9 with SMTP id qy9mr13146163pbc.3.1352290747665; Wed, 07 Nov 2012 04:19:07 -0800 (PST) Received: by 10.66.246.232 with HTTP; Wed, 7 Nov 2012 04:19:07 -0800 (PST) In-Reply-To: <20121107080421.GA1881@tucnak.redhat.com> References: <20121106221813.GZ1881@tucnak.redhat.com> <20121107080421.GA1881@tucnak.redhat.com> Date: Wed, 7 Nov 2012 13:19:07 +0100 Message-ID: Subject: Re: [PATCH] Vzeroupper placement/47440 From: Uros Bizjak To: Jakub Jelinek Cc: "H.J. Lu" , Kirill Yukhin , Vladimir Yakovlev , gcc-patches@gcc.gnu.org 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 On Wed, Nov 7, 2012 at 9:04 AM, Jakub Jelinek wrote: > Or I wonder why is call handled specially at all, doesn't > /* Check if a 256bit AVX register is referenced in stores. */ > state = unused; > note_stores (pat, check_avx256_stores, &state); > if (state == used) > return AVX_U128_DIRTY; > handle it? Then it would just need to be if (CALL_P (insn)) return AVX_U128_CLEAN. > BTW, the formatting is wrong in some spots, e.g. > check_avx256_stores (rtx dest, const_rtx set, void *data) > { > if (((REG_P (dest) || MEM_P(dest)) > > I'd prefer to leave this to the original submitter. I have committed following patch that address all the above issues. 2012-11-07 Uros Bizjak * config/i386/i386.c (enum upper_128bits_state): Remove. (check_avx256_store): Use bool pointer argument. (ix86_avx_u128_mode_needed): Use note_stores also for CALL insns. * config/i386/predicates.md (vzeroupper_operation): Use match_test. Bootstrapped and regression tested on x86_64-pc-linux-gnu, committed. Uros. Index: predicates.md =================================================================== --- predicates.md (revision 193292) +++ predicates.md (working copy) @@ -1231,10 +1231,8 @@ ;; return true if OP is a vzeroupper operation. (define_predicate "vzeroupper_operation" - (match_code "unspec_volatile") -{ - return XINT (op, 1) == UNSPECV_VZEROUPPER; -}) + (and (match_code "unspec_volatile") + (match_test "XINT (op, 1) == UNSPECV_VZEROUPPER"))) ;; Return true if OP is a parallel for a vbroadcast permute. Index: i386.c =================================================================== --- i386.c (revision 193292) +++ i386.c (working copy) @@ -65,27 +65,19 @@ along with GCC; see the file COPYING3. If not see #include "tree-pass.h" #include "tree-flow.h" -enum upper_128bits_state -{ - unknown = 0, - unused, - used -}; - /* Check if a 256bit AVX register is referenced in stores. */ static void check_avx256_stores (rtx dest, const_rtx set, void *data) { - if (((REG_P (dest) || MEM_P(dest)) + if (((REG_P (dest) || MEM_P (dest)) && VALID_AVX256_REG_OR_OI_MODE (GET_MODE (dest))) || (GET_CODE (set) == SET && (REG_P (SET_SRC (set)) || MEM_P (SET_SRC (set))) && VALID_AVX256_REG_OR_OI_MODE (GET_MODE (SET_SRC (set))))) { - enum upper_128bits_state *state - = (enum upper_128bits_state *) data; - *state = used; + bool *used = (bool *) data; + *used = true; } } @@ -14967,23 +14959,24 @@ output_387_binary_op (rtx insn, rtx *operands) static int ix86_avx_u128_mode_needed (rtx insn) { - rtx pat = PATTERN (insn); - rtx arg; - enum upper_128bits_state state; + bool avx_u128_used; if (CALL_P (insn)) { + rtx link; + /* Needed mode is set to AVX_U128_CLEAN if there are no 256bit modes used in function arguments. */ - for (arg = CALL_INSN_FUNCTION_USAGE (insn); arg; - arg = XEXP (arg, 1)) + for (link = CALL_INSN_FUNCTION_USAGE (insn); + link; + link = XEXP (link, 1)) { - if (GET_CODE (XEXP (arg, 0)) == USE) + if (GET_CODE (XEXP (link, 0)) == USE) { - rtx reg = XEXP (XEXP (arg, 0), 0); + rtx arg = XEXP (XEXP (link, 0), 0); - if (reg && REG_P (reg) - && VALID_AVX256_REG_OR_OI_MODE (GET_MODE (reg))) + if (REG_P (arg) + && VALID_AVX256_REG_OR_OI_MODE (GET_MODE (arg))) return AVX_U128_ANY; } } @@ -14992,10 +14985,11 @@ ix86_avx_u128_mode_needed (rtx insn) } /* Check if a 256bit AVX register is referenced in stores. */ - state = unused; - note_stores (pat, check_avx256_stores, &state); - if (state == used) + avx_u128_used = false; + note_stores (PATTERN (insn), check_avx256_stores, &avx_u128_used); + if (avx_u128_used) return AVX_U128_DIRTY; + return AVX_U128_ANY; } @@ -15079,39 +15073,21 @@ static int ix86_avx_u128_mode_after (int mode, rtx insn) { rtx pat = PATTERN (insn); - rtx reg = NULL; - int i; - enum upper_128bits_state state; + bool avx_u128_used; - /* Check for CALL instruction. */ - if (CALL_P (insn)) - { - if (GET_CODE (pat) == SET) - reg = SET_DEST (pat); - else if (GET_CODE (pat) == PARALLEL) - for (i = XVECLEN (pat, 0) - 1; i >= 0; i--) - { - rtx x = XVECEXP (pat, 0, i); - if (GET_CODE(x) == SET) - reg = SET_DEST (x); - } - /* Mode after call is set to AVX_U128_DIRTY if there are - 256bit modes used in the function return register. */ - if (reg && REG_P (reg) && VALID_AVX256_REG_OR_OI_MODE (GET_MODE (reg))) - return AVX_U128_DIRTY; - else - return AVX_U128_CLEAN; - } - if (vzeroupper_operation (pat, VOIDmode) || vzeroall_operation (pat, VOIDmode)) return AVX_U128_CLEAN; /* Check if a 256bit AVX register is referenced in stores. */ - state = unused; - note_stores (pat, check_avx256_stores, &state); - if (state == used) + avx_u128_used = false; + note_stores (pat, check_avx256_stores, &avx_u128_used); + if (avx_u128_used) return AVX_U128_DIRTY; + /* We know that state is clean after CALL insn if there are no + 256bit modes used in the function return register. */ + else if (CALL_P (insn)) + return AVX_U128_CLEAN; return mode; } @@ -15145,9 +15121,10 @@ ix86_avx_u128_mode_entry (void) for (arg = DECL_ARGUMENTS (current_function_decl); arg; arg = TREE_CHAIN (arg)) { - rtx reg = DECL_INCOMING_RTL (arg); + rtx incoming = DECL_INCOMING_RTL (arg); - if (reg && REG_P (reg) && VALID_AVX256_REG_OR_OI_MODE (GET_MODE (reg))) + if (incoming && REG_P (incoming) + && VALID_AVX256_REG_OR_OI_MODE (GET_MODE (incoming))) return AVX_U128_DIRTY; }