[llvm] r228556 - InstCombine: propagate nonNull through assume
Ramkumar Ramachandra
artagnon at gmail.com
Sun Feb 8 17:13:13 PST 2015
Author: artagnon
Date: Sun Feb 8 19:13:13 2015
New Revision: 228556
URL: http://llvm.org/viewvc/llvm-project?rev=228556&view=rev
Log:
InstCombine: propagate nonNull through assume
Make assume (load (call|invoke) != null) set nonNull return attribute
for the call and invoke. Also include tests.
Differential Revision: http://reviews.llvm.org/D7107
Modified:
llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp
llvm/trunk/test/Transforms/InstCombine/assume.ll
Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp?rev=228556&r1=228555&r2=228556&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp Sun Feb 8 19:13:13 2015
@@ -1081,12 +1081,19 @@ Instruction *InstCombiner::visitCallInst
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,
Modified: llvm/trunk/test/Transforms/InstCombine/assume.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/assume.ll?rev=228556&r1=228555&r2=228556&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/assume.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/assume.ll Sun Feb 8 19:13:13 2015
@@ -257,8 +257,45 @@ entry:
; CHECK: call void @llvm.assume
}
+declare i32** @id(i32** %a)
+; Check that nonnull return attribute is applied to call
+define i1 @nonnull5(i32** %a) {
+entry:
+ %idr = call i32** @id(i32** %a)
+ %load = load i32** %idr
+ %cmp = icmp ne i32* %load, null
+ tail call void @llvm.assume(i1 %cmp)
+ %rval = icmp eq i32* %load, null
+ ret i1 %rval
+; CHECK-LABEL: @nonnull5
+; CHECK: call nonnull
+; CHECK-NOT: call void @llvm.assume
+; CHECK: ret i1 false
+}
+
+declare i32 @__personality0(...)
+
+; Check that nonnull return attribute is applied to invoke
+define i1 @nonnull6(i32** %a) {
+entry:
+ %idr = invoke i32** @id(i32** %a) to label %norm unwind label %lpad
+norm:
+ %load = load i32** %idr
+ %cmp = icmp ne i32* %load, null
+ tail call void @llvm.assume(i1 %cmp)
+ %rval = icmp eq i32* %load, null
+ ret i1 %rval
+lpad:
+ %res = landingpad { i8*, i32 } personality i32 (...)* @__personality0 cleanup
+ resume { i8*, i32 } undef
+
+; CHECK-LABEL: @nonnull6
+; CHECK: invoke nonnull
+; CHECK-NOT: call void @llvm.assume
+; CHECK: ret i1 false
+}
attributes #0 = { nounwind uwtable }
attributes #1 = { nounwind }
More information about the llvm-commits
mailing list