diff options
author | Craig Topper <craig.topper@intel.com> | 2018-06-26 01:37:02 +0000 |
---|---|---|
committer | Craig Topper <craig.topper@intel.com> | 2018-06-26 01:37:02 +0000 |
commit | 689e363ff2294f43d2ee35d08777f7a7ea0ce7dd (patch) | |
tree | 9fbdd280f09e5a2adf4917f2477a50bf8224000a /llvm/lib/IR/AutoUpgrade.cpp | |
parent | 9766fd64fba0c3a8a118aee795133a3bab69a0f5 (diff) | |
download | bcm5719-llvm-689e363ff2294f43d2ee35d08777f7a7ea0ce7dd.tar.gz bcm5719-llvm-689e363ff2294f43d2ee35d08777f7a7ea0ce7dd.zip |
[X86] Redefine avx512 packed fpclass intrinsics to return a vXi1 mask and implement the mask input argument using an 'and' IR instruction.
This recommits r335562 and 335563 as a single commit.
The frontend will surround the intrinsic with the appropriate marshalling to/from a scalar type to match the sigature of the builtin that software expects.
By exposing the vXi1 type directly in the llvm intrinsic we make it available to optimizers much earlier. This can enable the scalar marshalling code to be optimized away.
llvm-svn: 335568
Diffstat (limited to 'llvm/lib/IR/AutoUpgrade.cpp')
-rw-r--r-- | llvm/lib/IR/AutoUpgrade.cpp | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp index 4a79275feea..65d9bd54e4f 100644 --- a/llvm/lib/IR/AutoUpgrade.cpp +++ b/llvm/lib/IR/AutoUpgrade.cpp @@ -406,6 +406,24 @@ static bool UpgradeX86IntrinsicFunction(Function *F, StringRef Name, if (Name == "avx512.mask.cmp.ps.512") // Added in 7.0 return UpgradeX86MaskedFPCompare(F, Intrinsic::x86_avx512_mask_cmp_ps_512, NewFn); + if (Name == "avx512.mask.fpclass.pd.128") // Added in 7.0 + return UpgradeX86MaskedFPCompare(F, Intrinsic::x86_avx512_mask_fpclass_pd_128, + NewFn); + if (Name == "avx512.mask.fpclass.pd.256") // Added in 7.0 + return UpgradeX86MaskedFPCompare(F, Intrinsic::x86_avx512_mask_fpclass_pd_256, + NewFn); + if (Name == "avx512.mask.fpclass.pd.512") // Added in 7.0 + return UpgradeX86MaskedFPCompare(F, Intrinsic::x86_avx512_mask_fpclass_pd_512, + NewFn); + if (Name == "avx512.mask.fpclass.ps.128") // Added in 7.0 + return UpgradeX86MaskedFPCompare(F, Intrinsic::x86_avx512_mask_fpclass_ps_128, + NewFn); + if (Name == "avx512.mask.fpclass.ps.256") // Added in 7.0 + return UpgradeX86MaskedFPCompare(F, Intrinsic::x86_avx512_mask_fpclass_ps_256, + NewFn); + if (Name == "avx512.mask.fpclass.ps.512") // Added in 7.0 + return UpgradeX86MaskedFPCompare(F, Intrinsic::x86_avx512_mask_fpclass_ps_512, + NewFn); // frcz.ss/sd may need to have an argument dropped. Added in 3.2 if (Name.startswith("xop.vfrcz.ss") && F->arg_size() == 2) { @@ -3125,6 +3143,31 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { return; } + case Intrinsic::x86_avx512_mask_fpclass_pd_128: + case Intrinsic::x86_avx512_mask_fpclass_pd_256: + case Intrinsic::x86_avx512_mask_fpclass_pd_512: + case Intrinsic::x86_avx512_mask_fpclass_ps_128: + case Intrinsic::x86_avx512_mask_fpclass_ps_256: + case Intrinsic::x86_avx512_mask_fpclass_ps_512: { + SmallVector<Value *, 4> Args; + Args.push_back(CI->getArgOperand(0)); + Args.push_back(CI->getArgOperand(1)); + + NewCall = Builder.CreateCall(NewFn, Args); + unsigned NumElts = Args[0]->getType()->getVectorNumElements(); + Value *Res = ApplyX86MaskOn1BitsVec(Builder, NewCall, CI->getArgOperand(2), + NumElts); + + std::string Name = CI->getName(); + if (!Name.empty()) { + CI->setName(Name + ".old"); + NewCall->setName(Name); + } + CI->replaceAllUsesWith(Res); + CI->eraseFromParent(); + return; + } + case Intrinsic::thread_pointer: { NewCall = Builder.CreateCall(NewFn, {}); break; |