re PR target/59021 (new vzeroupper instructions generated with -mavx)
authorUros Bizjak <uros@gcc.gnu.org>
Wed, 6 Nov 2013 19:37:12 +0000 (20:37 +0100)
committerUros Bizjak <uros@gcc.gnu.org>
Wed, 6 Nov 2013 19:37:12 +0000 (20:37 +0100)
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

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr59021.c [new file with mode: 0644]

index 9d45b0c..cf11200 100644 (file)
@@ -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.
 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
        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,
index 0680dea..53e04c4 100644 (file)
@@ -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
index 30c1d35..463be1e 100644 (file)
@@ -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 (file)
index 0000000..a1df27b
--- /dev/null
@@ -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" } } */