From: Uros Bizjak <ubizjak@gmail.com>
To: Jakub Jelinek <jakub@redhat.com>
Cc: "H.J. Lu" <hjl.tools@gmail.com>,
Kirill Yukhin <kirill.yukhin@gmail.com>,
Vladimir Yakovlev <vbyakovl23@gmail.com>,
gcc-patches@gcc.gnu.org
Subject: Re: [PATCH] Vzeroupper placement/47440
Date: Wed, 07 Nov 2012 12:19:00 -0000 [thread overview]
Message-ID: <CAFULd4bUhyGz=BTTt7RA09FNpw05MG7fwX_0Wqf_Y69Y6WHMFw@mail.gmail.com> (raw)
In-Reply-To: <20121107080421.GA1881@tucnak.redhat.com>
[-- Attachment #1: Type: text/plain, Size: 1058 bytes --]
On Wed, Nov 7, 2012 at 9:04 AM, Jakub Jelinek <jakub@redhat.com> 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 <ubizjak@gmail.com>
* 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.
[-- Attachment #2: p.diff.txt --]
[-- Type: text/plain, Size: 4678 bytes --]
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;
}
next prev parent reply other threads:[~2012-11-07 12:19 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-05 19:52 Uros Bizjak
2012-11-06 10:30 ` Kirill Yukhin
2012-11-06 22:11 ` H.J. Lu
2012-11-06 22:18 ` Jakub Jelinek
2012-11-07 7:03 ` Uros Bizjak
2012-11-07 7:08 ` Uros Bizjak
2012-11-07 8:05 ` Jakub Jelinek
2012-11-07 9:42 ` Uros Bizjak
2012-11-07 12:19 ` Uros Bizjak [this message]
2012-11-07 15:09 ` Vladimir Yakovlev
2012-11-08 5:49 ` Vladimir Yakovlev
[not found] <CAK1BsWrsVu4TRW50RW0X7G4RSguSAjhqFPe-tkeXKaurr=sX1A@mail.gmail.com>
[not found] ` <CAFULd4b0y6GGZsn1s4-RXc1mAvZGrhGd4YQBhfLgeMWmv2eXPA@mail.gmail.com>
[not found] ` <CAK1BsWoL5hsfZprf-a8zxG+Bhe9SwGFwqxHxOw9UX+bbsFD5oQ@mail.gmail.com>
[not found] ` <CAFULd4bJXT-nnAk6HCn2C=+jhfiUD-fAe3LK8AYd9jgqQQHvKQ@mail.gmail.com>
[not found] ` <CAFULd4bdxuKbYYS7TcyRfjNukLvJ0d5pOD7zJGAyKEQLPq7z2Q@mail.gmail.com>
[not found] ` <CAK1BsWpL69eRHTD8dzVOm9xtOqtjcr6z3B2tvb_VikWPzKT0Dw@mail.gmail.com>
[not found] ` <CAFULd4YaVLCYF=Huw_kDozTBTcZnGUAy7xOcV+VEweOWZ5Cigg@mail.gmail.com>
[not found] ` <CAFULd4YyRVY4BzD+csZAqCCmB7v3YEwAaOpNW9QsMXEbCkFw+Q@mail.gmail.com>
2012-11-09 12:18 ` [off-list] " Vladimir Yakovlev
2012-11-09 12:29 ` Uros Bizjak
2012-11-09 12:36 ` Jakub Jelinek
2012-11-09 12:48 ` Uros Bizjak
2012-11-09 13:28 ` Uros Bizjak
2012-11-16 7:50 ` Uros Bizjak
-- strict thread matches above, loose matches on Subject: below --
2012-11-04 13:29 Uros Bizjak
2012-11-04 17:59 ` Uros Bizjak
[not found] ` <CAK1BsWpoD4AVB_4+J6snJgs4BF1Jbiw-RrifvZiiAm21qRURew@mail.gmail.com>
[not found] ` <CAFULd4Y5zDhMH3h34Lt0O5xNG+xibDJih7q2_ctef7nqSNJcOQ@mail.gmail.com>
2012-11-04 20:28 ` Vladimir Yakovlev
2012-11-04 4:31 Vladimir Yakovlev
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAFULd4bUhyGz=BTTt7RA09FNpw05MG7fwX_0Wqf_Y69Y6WHMFw@mail.gmail.com' \
--to=ubizjak@gmail.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=hjl.tools@gmail.com \
--cc=jakub@redhat.com \
--cc=kirill.yukhin@gmail.com \
--cc=vbyakovl23@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).