Hi!

The avx-vzeroupper-14.c testcase now fails, because normal epilogue isn't
emitted and before simple_return or return we forgot to emit the vzeroupper
insn.  Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux,
ok for trunk?

2011-11-11  Jakub Jelinek  <ja...@redhat.com>

        * config/i386/i386-protos.h (ix86_maybe_emit_epilogue_vzeroupper):
        New prototype.
        * config/i386/i386.c (ix86_maybe_emit_epilogue_vzeroupper): New
        function.
        (ix86_expand_epilogue): Use it.
        * config/i386/i386.md (return, simple_return): Call it in the
        expanders.

--- gcc/config/i386/i386-protos.h.jj    2011-11-07 12:40:55.000000000 +0100
+++ gcc/config/i386/i386-protos.h       2011-11-11 13:39:48.322746212 +0100
@@ -32,6 +32,7 @@ extern void ix86_setup_frame_addresses (
 
 extern HOST_WIDE_INT ix86_initial_elimination_offset (int, int);
 extern void ix86_expand_prologue (void);
+extern void ix86_maybe_emit_epilogue_vzeroupper (void);
 extern void ix86_expand_epilogue (int);
 extern void ix86_expand_split_stack_prologue (void);
 
--- gcc/config/i386/i386.c.jj   2011-11-10 18:09:12.000000000 +0100
+++ gcc/config/i386/i386.c      2011-11-11 13:39:22.375900662 +0100
@@ -10614,6 +10614,17 @@ ix86_emit_restore_sse_regs_using_mov (HO
       }
 }
 
+/* Emit vzeroupper if needed.  */
+
+void
+ix86_maybe_emit_epilogue_vzeroupper (void)
+{
+  if (TARGET_VZEROUPPER
+      && !TREE_THIS_VOLATILE (cfun->decl)
+      && !cfun->machine->caller_return_avx256_p)
+    emit_insn (gen_avx_vzeroupper (GEN_INT (call_no_avx256)));
+}
+
 /* Restore function stack, frame, and registers.  */
 
 void
@@ -10911,10 +10922,7 @@ ix86_expand_epilogue (int style)
     }
 
   /* Emit vzeroupper if needed.  */
-  if (TARGET_VZEROUPPER
-      && !TREE_THIS_VOLATILE (cfun->decl)
-      && !cfun->machine->caller_return_avx256_p)
-    emit_insn (gen_avx_vzeroupper (GEN_INT (call_no_avx256)));
+  ix86_maybe_emit_epilogue_vzeroupper ();
 
   if (crtl->args.pops_args && crtl->args.size)
     {
--- gcc/config/i386/i386.md.jj  2011-11-08 09:27:01.000000000 +0100
+++ gcc/config/i386/i386.md     2011-11-11 13:40:41.081432858 +0100
@@ -11736,6 +11736,7 @@ (define_expand "return"
   [(simple_return)]
   "ix86_can_use_return_insn_p ()"
 {
+  ix86_maybe_emit_epilogue_vzeroupper ();
   if (crtl->args.pops_args)
     {
       rtx popc = GEN_INT (crtl->args.pops_args);
@@ -11752,6 +11753,7 @@ (define_expand "simple_return"
   [(simple_return)]
   "!TARGET_SEH"
 {
+  ix86_maybe_emit_epilogue_vzeroupper ();
   if (crtl->args.pops_args)
     {
       rtx popc = GEN_INT (crtl->args.pops_args);

        Jakub

Reply via email to