[PATCH] D12779: [InstCombineCalls] Use isKnownNonNullAt() to check nullness of passing arguments at callsite
Chen Li via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 14 11:10:42 PDT 2015
chenli updated the summary for this revision.
chenli updated this revision to Diff 34707.
chenli added a comment.
Update test case and summary.
http://reviews.llvm.org/D12779
Files:
lib/Analysis/ValueTracking.cpp
lib/Transforms/InstCombine/InstCombineCalls.cpp
test/Transforms/InstCombine/call_nonnull_arg.ll
Index: test/Transforms/InstCombine/call_nonnull_arg.ll
===================================================================
--- test/Transforms/InstCombine/call_nonnull_arg.ll
+++ test/Transforms/InstCombine/call_nonnull_arg.ll
@@ -0,0 +1,20 @@
+; RUN: opt < %s -instcombine -S | FileCheck %s
+
+; InstCombine should mark null-checked argument as nonnull at callsite
+declare void @dummy(i32*, i32)
+
+define void @test(i32* %a, i32 %b) {
+; CHECK-LABEL: @test
+; CHECK: call void @dummy(i32* nonnull %a, i32 %b)
+entry:
+ %cond1 = icmp eq i32* %a, null
+ br i1 %cond1, label %dead, label %not_null
+not_null:
+ %cond2 = icmp eq i32 %b, 0
+ br i1 %cond2, label %dead, label %not_zero
+not_zero:
+ call void @dummy(i32* %a, i32 %b)
+ ret void
+dead:
+ unreachable
+}
Index: lib/Transforms/InstCombine/InstCombineCalls.cpp
===================================================================
--- lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -1583,8 +1583,8 @@
// checks on their arguments.
unsigned ArgNo = 0;
for (Value *V : CS.args()) {
- if (!CS.paramHasAttr(ArgNo+1, Attribute::NonNull) &&
- isKnownNonNull(V)) {
+ if (V->getType()->isPointerTy() && !CS.paramHasAttr(ArgNo+1, Attribute::NonNull) &&
+ isKnownNonNullAt(V, CS.getInstruction(), DT, TLI)) {
AttributeSet AS = CS.getAttributes();
AS = AS.addAttribute(CS.getInstruction()->getContext(), ArgNo+1,
Attribute::NonNull);
Index: lib/Analysis/ValueTracking.cpp
===================================================================
--- lib/Analysis/ValueTracking.cpp
+++ lib/Analysis/ValueTracking.cpp
@@ -3220,6 +3220,8 @@
/// Return true if we know that the specified value is never null.
bool llvm::isKnownNonNull(const Value *V, const TargetLibraryInfo *TLI) {
+ assert(V->getType()->isPointerTy() && "V must be pointer type");
+
// Alloca never returns null, malloc might.
if (isa<AllocaInst>(V)) return true;
@@ -3252,6 +3254,8 @@
static bool isKnownNonNullFromDominatingCondition(const Value *V,
const Instruction *CtxI,
const DominatorTree *DT) {
+ assert(V->getType()->isPointerTy() && "V must be pointer type");
+
unsigned NumUsesExplored = 0;
for (auto U : V->users()) {
// Avoid massive lists
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D12779.34707.patch
Type: text/x-patch
Size: 2421 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150914/4d9eade2/attachment.bin>
More information about the llvm-commits
mailing list