summaryrefslogtreecommitdiffstats
path: root/llvm/lib/IR/AutoUpgrade.cpp
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@intel.com>2019-01-26 02:41:54 +0000
committerCraig Topper <craig.topper@intel.com>2019-01-26 02:41:54 +0000
commit6c9c7d0796f506192d385f743edb16c4ad8be39a (patch)
tree6462c14ecb1bb865910534b024be929f09c3c66b /llvm/lib/IR/AutoUpgrade.cpp
parent71ab4acb16a2b4250b363f11eb320f1d839c0c43 (diff)
downloadbcm5719-llvm-6c9c7d0796f506192d385f743edb16c4ad8be39a.tar.gz
bcm5719-llvm-6c9c7d0796f506192d385f743edb16c4ad8be39a.zip
[X86] Remove GCCBuiltins from 512-bit cvt(u)qqtops, cvt(u)qqtopd, and cvt(u)dqtops intrinsics. Add new variadic uitofp/sitofp with rounding mode intrinsics.
Summary: See clang patch D56998 for a full description. Reviewers: RKSimon, spatel Reviewed By: RKSimon Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D56999 llvm-svn: 352266
Diffstat (limited to 'llvm/lib/IR/AutoUpgrade.cpp')
-rw-r--r--llvm/lib/IR/AutoUpgrade.cpp55
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."))) {
OpenPOWER on IntegriCloud