diff options
Diffstat (limited to 'llvm/lib/IR/AutoUpgrade.cpp')
-rw-r--r-- | llvm/lib/IR/AutoUpgrade.cpp | 55 |
1 files changed, 32 insertions, 23 deletions
diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp index 8f49c8eac88..d8949661e96 100644 --- a/llvm/lib/IR/AutoUpgrade.cpp +++ b/llvm/lib/IR/AutoUpgrade.cpp @@ -198,14 +198,14 @@ static bool ShouldUpgradeX86Intrinsic(Function *F, StringRef Name) { Name.startswith("avx512.mask.pmull.") || // Added in 4.0 Name.startswith("avx512.mask.cvtdq2pd.") || // Added in 4.0 Name.startswith("avx512.mask.cvtudq2pd.") || // Added in 4.0 - Name == "avx512.mask.cvtudq2ps.128" || // Added in 7.0 - Name == "avx512.mask.cvtudq2ps.256" || // Added in 7.0 - Name == "avx512.mask.cvtqq2pd.128" || // Added in 7.0 - Name == "avx512.mask.cvtqq2pd.256" || // Added in 7.0 - Name == "avx512.mask.cvtuqq2pd.128" || // Added in 7.0 - Name == "avx512.mask.cvtuqq2pd.256" || // Added in 7.0 - Name == "avx512.mask.cvtdq2ps.128" || // Added in 7.0 - Name == "avx512.mask.cvtdq2ps.256" || // Added in 7.0 + Name.startswith("avx512.mask.cvtudq2ps.") || // Added in 7.0 updated 9.0 + Name.startswith("avx512.mask.cvtqq2pd.") || // Added in 7.0 updated 9.0 + Name.startswith("avx512.mask.cvtuqq2pd.") || // Added in 7.0 updated 9.0 + Name.startswith("avx512.mask.cvtdq2ps.") || // Added in 7.0 updated 9.0 + Name == "avx512.mask.cvtqq2ps.256" || // Added in 9.0 + Name == "avx512.mask.cvtqq2ps.512" || // Added in 9.0 + Name == "avx512.mask.cvtuqq2ps.256" || // Added in 9.0 + Name == "avx512.mask.cvtuqq2ps.512" || // Added in 9.0 Name == "avx512.mask.cvtpd2dq.256" || // Added in 7.0 Name == "avx512.mask.cvtpd2ps.256" || // Added in 7.0 Name == "avx512.mask.cvttpd2dq.256" || // Added in 7.0 @@ -1958,38 +1958,47 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { Name == "avx.cvtdq2.ps.256" || Name.startswith("avx512.mask.cvtdq2pd.") || Name.startswith("avx512.mask.cvtudq2pd.") || - Name == "avx512.mask.cvtdq2ps.128" || - Name == "avx512.mask.cvtdq2ps.256" || - Name == "avx512.mask.cvtudq2ps.128" || - Name == "avx512.mask.cvtudq2ps.256" || - Name == "avx512.mask.cvtqq2pd.128" || - Name == "avx512.mask.cvtqq2pd.256" || - Name == "avx512.mask.cvtuqq2pd.128" || - Name == "avx512.mask.cvtuqq2pd.256" || + Name.startswith("avx512.mask.cvtdq2ps.") || + Name.startswith("avx512.mask.cvtudq2ps.") || + Name.startswith("avx512.mask.cvtqq2pd.") || + Name.startswith("avx512.mask.cvtuqq2pd.") || + Name == "avx512.mask.cvtqq2ps.256" || + Name == "avx512.mask.cvtqq2ps.512" || + Name == "avx512.mask.cvtuqq2ps.256" || + Name == "avx512.mask.cvtuqq2ps.512" || Name == "sse2.cvtps2pd" || Name == "avx.cvt.ps2.pd.256" || Name == "avx512.mask.cvtps2pd.128" || Name == "avx512.mask.cvtps2pd.256")) { Type *DstTy = CI->getType(); Rep = CI->getArgOperand(0); + Type *SrcTy = Rep->getType(); unsigned NumDstElts = DstTy->getVectorNumElements(); - if (NumDstElts < Rep->getType()->getVectorNumElements()) { + if (NumDstElts < SrcTy->getVectorNumElements()) { assert(NumDstElts == 2 && "Unexpected vector size"); uint32_t ShuffleMask[2] = { 0, 1 }; Rep = Builder.CreateShuffleVector(Rep, Rep, ShuffleMask); } - bool IsPS2PD = (StringRef::npos != Name.find("ps2")); + bool IsPS2PD = SrcTy->getVectorElementType()->isFloatTy(); bool IsUnsigned = (StringRef::npos != Name.find("cvtu")); if (IsPS2PD) Rep = Builder.CreateFPExt(Rep, DstTy, "cvtps2pd"); - else if (IsUnsigned) - Rep = Builder.CreateUIToFP(Rep, DstTy, "cvt"); - else - Rep = Builder.CreateSIToFP(Rep, DstTy, "cvt"); + else if (CI->getNumArgOperands() == 4 && + (!isa<ConstantInt>(CI->getArgOperand(3)) || + cast<ConstantInt>(CI->getArgOperand(3))->getZExtValue() != 4)) { + Intrinsic::ID IID = IsUnsigned ? Intrinsic::x86_avx512_uitofp_round + : Intrinsic::x86_avx512_sitofp_round; + Function *F = Intrinsic::getDeclaration(CI->getModule(), IID, + { DstTy, SrcTy }); + Rep = Builder.CreateCall(F, { Rep, CI->getArgOperand(3) }); + } else { + Rep = IsUnsigned ? Builder.CreateUIToFP(Rep, DstTy, "cvt") + : Builder.CreateSIToFP(Rep, DstTy, "cvt"); + } - if (CI->getNumArgOperands() == 3) + if (CI->getNumArgOperands() >= 3) Rep = EmitX86Select(Builder, CI->getArgOperand(2), Rep, CI->getArgOperand(1)); } else if (IsX86 && (Name.startswith("avx512.mask.loadu."))) { |