Index: lib/Transforms/InstCombine/InstCombineCalls.cpp =================================================================== --- lib/Transforms/InstCombine/InstCombineCalls.cpp +++ lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -1537,7 +1537,7 @@ unsigned ArgNo = 0; for (Value *V : CS.args()) { if (!CS.paramHasAttr(ArgNo+1, Attribute::NonNull) && - isKnownNonNull(V)) { + isKnownNonNullAt(V, CS.getInstruction(), DT, TLI)) { AttributeSet AS = CS.getAttributes(); AS = AS.addAttribute(CS.getInstruction()->getContext(), ArgNo+1, Attribute::NonNull); Index: test/Transforms/InstCombine/call_nonnull_arg.ll =================================================================== --- /dev/null +++ test/Transforms/InstCombine/call_nonnull_arg.ll @@ -0,0 +1,17 @@ +; RUN: opt < %s -instcombine -S | FileCheck %s + +; InstCombine should mark null-checked argument as nonnull at callsite +declare void @dummy(i32*) + +define void @test(i32* %a) { +; CHECK-LABEL: @test +; CHECK: call void @dummy(i32* nonnull %a) +entry: + %cond = icmp eq i32* %a, null + br i1 %cond, label %is_null, label %not_null +not_null: + call void @dummy(i32* %a) + ret void +is_null: + unreachable +}