diff --git a/llvm/lib/Target/X86/X86.td b/llvm/lib/Target/X86/X86.td --- a/llvm/lib/Target/X86/X86.td +++ b/llvm/lib/Target/X86/X86.td @@ -422,6 +422,8 @@ //===----------------------------------------------------------------------===// // X86 Subtarget Tuning features //===----------------------------------------------------------------------===// +def TuningSlowVtest : SubtargetFeature<"slow-vtest", "HasSlowVtest", "true", + "VTEST instruction is slow">; def TuningSlowSHLD : SubtargetFeature<"slow-shld", "IsSHLDSlow", "true", "SHLD instruction is slow">; @@ -1166,7 +1168,8 @@ FeatureMOVDIRI, FeatureMOVDIR64B, FeatureWAITPKG]; - list ADLAdditionalTuning = [TuningPERMFalseDeps]; + list ADLAdditionalTuning = [TuningPERMFalseDeps, + TuningSlowVtest]; list ADLTuning = !listconcat(SKLTuning, ADLAdditionalTuning); list ADLFeatures = !listconcat(TRMFeatures, ADLAdditionalFeatures); diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -48021,8 +48021,8 @@ // MOVMSKPS(V) !=/== -1 -> TESTPS(V,V) // MOVMSKPD(V) !=/== -1 -> TESTPD(V,V) // iff every element is referenced. - if (NumElts <= CmpBits && Subtarget.hasAVX() && IsOneUse && - (NumEltBits == 32 || NumEltBits == 64)) { + if (NumElts <= CmpBits && Subtarget.hasAVX() && !Subtarget.hasSlowVtest() && + IsOneUse && (NumEltBits == 32 || NumEltBits == 64)) { SDLoc DL(EFLAGS); MVT FloatSVT = MVT::getFloatingPointVT(NumEltBits); MVT FloatVT = MVT::getVectorVT(FloatSVT, NumElts);