diff options
author | Uros Bizjak <uros@gcc.gnu.org> | 2013-11-06 20:37:12 +0100 |
---|---|---|
committer | Uros Bizjak <uros@gcc.gnu.org> | 2013-11-06 20:37:12 +0100 |
commit | 992147ee6bc698a938feb38546ca25ce8b977651 (patch) | |
tree | cf340a333dfb0fe4b2d672ec9e1a479acf1c29e6 | |
parent | b6e168f33a07cd23b7e760bab8e22aa0b907e8aa (diff) | |
download | gcc-992147ee6bc698a938feb38546ca25ce8b977651.zip gcc-992147ee6bc698a938feb38546ca25ce8b977651.tar.gz gcc-992147ee6bc698a938feb38546ca25ce8b977651.tar.bz2 |
re PR target/59021 (new vzeroupper instructions generated with -mavx)
PR target/59021
* config/i386/i386.c (ix86_avx_u128_mode_needed): Require
AVX_U128_DIRTY mode for call_insn RTXes that use AVX256 registers.
(ix86_avx_u128_mode_needed): Return AVX_U128_DIRTY mode for call_insn
RTXes that return in AVX256 register.
testsuite/ChangeLog:
PR target/59021
* gcc.target/i386/pr59021.c: New test.
From-SVN: r204464
-rw-r--r-- | gcc/ChangeLog | 22 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr59021.c | 23 |
4 files changed, 45 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9d45b0c..cf11200 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,8 +1,15 @@ +2013-11-06 Uros Bizjak <ubizjak@gmail.com> + + PR target/59021 + * config/i386/i386.c (ix86_avx_u128_mode_needed): Require + AVX_U128_DIRTY mode for call_insn RTXes that use AVX256 registers. + (ix86_avx_u128_mode_needed): Return AVX_U128_DIRTY mode for call_insn + RTXes that return in AVX256 register. + 2013-11-06 Richard Biener <rguenther@suse.de> PR tree-optimization/58653 - * tree-predcom.c (ref_at_iteration): Rewrite to generate - a MEM_REF. + * tree-predcom.c (ref_at_iteration): Rewrite to generate a MEM_REF. (prepare_initializers_chain): Adjust. 2013-11-06 Andrew MacLeod <amacleod@redhat.com> @@ -48,8 +55,8 @@ 2013-11-06 Eric Botcazou <ebotcazou@adacore.com> - * config/i386/i386.c (ix86_expand_prologue): Optimize stack checking for - leaf functions without dynamic stack allocation. + * config/i386/i386.c (ix86_expand_prologue): Optimize stack + checking for leaf functions without dynamic stack allocation. * config/ia64/ia64.c (ia64_emit_probe_stack_range): Adjust. (ia64_expand_prologue): Likewise. * config/mips/mips.c (mips_expand_prologue): Likewise. @@ -183,8 +190,7 @@ 2013-11-05 Jeff Law <law@redhat.com> * Makefile.in (OBJS): Add gimple-ssa-isolate-paths.o - * common.opt (-fisolate-erroneous-paths): Add option and - documentation. + * common.opt (-fisolate-erroneous-paths): Add option and documentation. * gimple-ssa-isolate-paths.c: New file. * gimple.c (check_loadstore): New function. (infer_nonnull_range): Moved into gimple.c from tree-vrp.c @@ -233,12 +239,12 @@ virtual_operand_p, is_gimple_reg, is_gimple_val, is_gimple_asm_val, is_gimple_min_lval, is_gimple_call_addr, is_gimple_mem_ref_addr, gimple_decl_printable_name, useless_type_conversion_p, - types_compatible_p, gimple_can_coalesce_p, copy_var_decl): Move to + types_compatible_p, gimple_can_coalesce_p, copy_var_decl): Move to gimple-expr.[ch]. * gimple-expr.c: New File. (useless_type_conversion_p, gimple_set_body, gimple_body, gimple_has_body_p, gimple_decl_printable_name, copy_var_decl, - gimple_can_coalesce_p, extract_ops_from_tree_1, + gimple_can_coalesce_p, extract_ops_from_tree_1, gimple_cond_get_ops_from_tree, is_gimple_lvalue, is_gimple_condexpr, is_gimple_address, is_gimple_invariant_address, is_gimple_ip_invariant_address, is_gimple_min_invariant, diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 0680dea..53e04c4 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -15708,7 +15708,7 @@ ix86_avx_u128_mode_needed (rtx insn) rtx arg = XEXP (XEXP (link, 0), 0); if (ix86_check_avx256_register (&arg, NULL)) - return AVX_U128_ANY; + return AVX_U128_DIRTY; } } @@ -15828,8 +15828,8 @@ ix86_avx_u128_mode_after (int mode, rtx insn) { bool avx_reg256_found = false; note_stores (pat, ix86_check_avx256_stores, &avx_reg256_found); - if (!avx_reg256_found) - return AVX_U128_CLEAN; + + return avx_reg256_found ? AVX_U128_DIRTY : AVX_U128_CLEAN; } /* Otherwise, return current mode. Remember that if insn diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 30c1d35..463be1e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-11-06 Uros Bizjak <ubizjak@gmail.com> + + PR target/59021 + * gcc.target/i386/pr59021.c: New test. + 2013-11-06 James Lemke <jwlemke@codesourcery.com> * lib/gcc-defs.exp (dg-additional-files-options): Extend regsub for diff --git a/gcc/testsuite/gcc.target/i386/pr59021.c b/gcc/testsuite/gcc.target/i386/pr59021.c new file mode 100644 index 0000000..a1df27b --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr59021.c @@ -0,0 +1,23 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -mavx -mvzeroupper" } */ + +extern void abort (void); + +struct S { + int i1; + int i2; + int i3; +}; + +typedef double v4df __attribute__ ((vector_size (32))); + +extern int foo (v4df, int i1, int i2, int i3, int i4, int i5, struct S s); + +void bar (v4df v, struct S s) +{ + int r = foo (v, 1, 2, 3, 4, 5, s); + if (r) + abort (); +} + +/* { dg-final { scan-assembler-not "vzeroupper" } } */ |