Skip to content

Commit

Permalink
InstCombine: propagate nonNull through assume
Browse files Browse the repository at this point in the history
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

llvm-svn: 228556
  • Loading branch information
artagnon committed Feb 9, 2015
1 parent 6d3e840 commit a021ee6
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 1 deletion.
9 changes: 8 additions & 1 deletion llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
Expand Up @@ -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,
Expand Down
37 changes: 37 additions & 0 deletions llvm/test/Transforms/InstCombine/assume.ll
Expand Up @@ -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 }
Expand Down

0 comments on commit a021ee6

Please sign in to comment.