summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp9
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,
OpenPOWER on IntegriCloud