diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2017-02-23 00:44:03 +0000 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2017-02-23 00:44:03 +0000 |
commit | d4bca1e9ef901ca906149c9eda5bde283022c7f9 (patch) | |
tree | 5c7126138b8b7595c5082416b17ec1bb5e432251 /llvm/lib/Transforms | |
parent | 85d54b050e84819e01a996c9a9754d496e321d4e (diff) | |
download | bcm5719-llvm-d4bca1e9ef901ca906149c9eda5bde283022c7f9.tar.gz bcm5719-llvm-d4bca1e9ef901ca906149c9eda5bde283022c7f9.zip |
AMDGPU: Replace disabled exp inputs with undef
llvm-svn: 295914
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp index 7206a55d25d..664d113f9c1 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -3304,6 +3304,34 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) { RightShift->takeName(II); return replaceInstUsesWith(*II, RightShift); } + case Intrinsic::amdgcn_exp: + case Intrinsic::amdgcn_exp_compr: { + ConstantInt *En = dyn_cast<ConstantInt>(II->getArgOperand(1)); + if (!En) // Illegal. + break; + + unsigned EnBits = En->getZExtValue(); + if (EnBits == 0xf) + break; // All inputs enabled. + + bool IsCompr = II->getIntrinsicID() == Intrinsic::amdgcn_exp_compr; + bool Changed = false; + for (int I = 0; I < (IsCompr ? 2 : 4); ++I) { + if ((!IsCompr && (EnBits & (1 << I)) == 0) || + (IsCompr && ((EnBits & (0x3 << (2 * I))) == 0))) { + Value *Src = II->getArgOperand(I + 2); + if (!isa<UndefValue>(Src)) { + II->setArgOperand(I + 2, UndefValue::get(Src->getType())); + Changed = true; + } + } + } + + if (Changed) + return II; + + break; + } case Intrinsic::stackrestore: { // If the save is right next to the restore, remove the restore. This can // happen when variable allocas are DCE'd. |