@@ -108,7 +108,7 @@ check_avx256_stores (rtx dest, const_rtx set, void *data)
static void
move_or_delete_vzeroupper_2 (basic_block bb, bool upper_128bits_set)
{
- rtx insn;
+ rtx insn, last;
rtx vzeroupper_insn = NULL_RTX;
rtx pat;
int avx256;
@@ -118,9 +118,12 @@ move_or_delete_vzeroupper_2 (basic_block bb, bool upper_128bits_set)
bb->index, upper_128bits_set);
insn = BB_HEAD (bb);
+ last = NEXT_INSN (BB_END (bb));
while (insn != BB_END (bb))
{
insn = NEXT_INSN (insn);
+ if (insn == last)
+ break;
if (!NONDEBUG_INSN_P (insn))
continue;
@@ -10970,7 +10973,7 @@ ix86_expand_epilogue (int style)
/* Emit vzeroupper if needed. */
if (TARGET_VZEROUPPER
- && cfun->machine->use_avx256_p
+ && (cfun->machine->use_avx256_p || flag_tree_vectorize)
&& !cfun->machine->caller_return_avx256_p)
{
cfun->machine->use_vzeroupper_p = 1;
@@ -21661,7 +21664,8 @@ ix86_expand_call (rtx retval, rtx fnaddr, rtx callarg1,
}
/* Add UNSPEC_CALL_NEEDS_VZEROUPPER decoration. */
- if (TARGET_VZEROUPPER && cfun->machine->use_avx256_p)
+ if (TARGET_VZEROUPPER
+ && (cfun->machine->use_avx256_p || flag_tree_vectorize))
{
rtx unspec;
int avx256;
new file mode 100644
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -mavx -mtune=generic -dp" } */
+
+extern void free (void *);
+void
+bar (void *ncstrp)
+{
+ if(ncstrp==((void *)0))
+ return;
+ free(ncstrp);
+}
+
+/* { dg-final { scan-assembler-not "avx_vzeroupper" } } */