Index: llvm/trunk/lib/Target/X86/X86VZeroUpper.cpp =================================================================== --- llvm/trunk/lib/Target/X86/X86VZeroUpper.cpp +++ llvm/trunk/lib/Target/X86/X86VZeroUpper.cpp @@ -192,6 +192,12 @@ if ((!IsControlFlow || IsReturnFromX86INTR) && CurState == EXITS_DIRTY) continue; + // Ignore existing VZERO* instructions. + // FIXME: The existence of these instructions should be used to modify the + // current state and/or used when deciding whether we need to create a VZU. + if (MI->getOpcode() == X86::VZEROALL || MI->getOpcode() == X86::VZEROUPPER) + continue; + if (hasYmmReg(MI)) { // We found a ymm-using instruction; this could be an AVX instruction, // or it could be control flow. Index: llvm/trunk/test/CodeGen/X86/avx-intrinsics-fast-isel.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/avx-intrinsics-fast-isel.ll +++ llvm/trunk/test/CodeGen/X86/avx-intrinsics-fast-isel.ll @@ -3736,13 +3736,11 @@ ; X32-LABEL: test_mm256_zeroall: ; X32: # BB#0: ; X32-NEXT: vzeroall -; X32-NEXT: vzeroupper ; X32-NEXT: retl ; ; X64-LABEL: test_mm256_zeroall: ; X64: # BB#0: ; X64-NEXT: vzeroall -; X64-NEXT: vzeroupper ; X64-NEXT: retq call void @llvm.x86.avx.vzeroall() ret void @@ -3753,13 +3751,11 @@ ; X32-LABEL: test_mm256_zeroupper: ; X32: # BB#0: ; X32-NEXT: vzeroupper -; X32-NEXT: vzeroupper ; X32-NEXT: retl ; ; X64-LABEL: test_mm256_zeroupper: ; X64: # BB#0: ; X64-NEXT: vzeroupper -; X64-NEXT: vzeroupper ; X64-NEXT: retq call void @llvm.x86.avx.vzeroupper() ret void Index: llvm/trunk/test/CodeGen/X86/avx-intrinsics-x86.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/avx-intrinsics-x86.ll +++ llvm/trunk/test/CodeGen/X86/avx-intrinsics-x86.ll @@ -4755,7 +4755,6 @@ ; AVX-LABEL: test_x86_avx_vzeroall: ; AVX: ## BB#0: ; AVX-NEXT: vzeroall -; AVX-NEXT: vzeroupper ; AVX-NEXT: retl ; ; AVX512VL-LABEL: test_x86_avx_vzeroall: @@ -4772,7 +4771,6 @@ ; AVX-LABEL: test_x86_avx_vzeroupper: ; AVX: ## BB#0: ; AVX-NEXT: vzeroupper -; AVX-NEXT: vzeroupper ; AVX-NEXT: retl ; ; AVX512VL-LABEL: test_x86_avx_vzeroupper: