diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp index 87dc8621a95..54b8a544ce9 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -1081,12 +1081,19 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) { cast<Constant>(RHS)->isNullValue()) { LoadInst* LI = cast<LoadInst>(LHS); if (isValidAssumeForContext(II, LI, DL, DT)) { + // assume( load (call|invoke) != null ) -> add 'nonnull' return + // attribute + Value *LIOperand = LI->getOperand(0); + if (CallInst *I = dyn_cast<CallInst>(LIOperand)) + I->addAttribute(AttributeSet::ReturnIndex, Attribute::NonNull); + else if (InvokeInst *I = dyn_cast<InvokeInst>(LIOperand)) + I->addAttribute(AttributeSet::ReturnIndex, Attribute::NonNull); + MDNode *MD = MDNode::get(II->getContext(), None); LI->setMetadata(LLVMContext::MD_nonnull, MD); return EraseInstFromFunction(*II); } } - // TODO: apply nonnull return attributes to calls and invokes // TODO: apply range metadata for range check patterns? } // If there is a dominating assume with the same condition as this one, |

