Index: lib/Analysis/ValueTracking.cpp =================================================================== --- lib/Analysis/ValueTracking.cpp +++ lib/Analysis/ValueTracking.cpp @@ -411,6 +411,7 @@ case Intrinsic::invariant_end: case Intrinsic::lifetime_start: case Intrinsic::lifetime_end: + case Intrinsic::noalias: case Intrinsic::objectsize: case Intrinsic::ptr_annotation: case Intrinsic::var_annotation: Index: test/Transforms/InstCombine/assume.ll =================================================================== --- test/Transforms/InstCombine/assume.ll +++ test/Transforms/InstCombine/assume.ll @@ -275,6 +275,26 @@ ret i1 %rval } +define i1 @nonnull5(i32** %a) { +entry: + %load = load i32*, i32** %a + ;; This call cannot actually trap, and so should not disrupt the assume. + %v = call i32* @llvm.noalias.p0i32(i32* %load, metadata !1) + %cmp = icmp ne i32* %load, null + tail call void @llvm.assume(i1 %cmp) + %q = bitcast i32** %a to i32* + %rval = icmp eq i32* %v, %q + ret i1 %rval + +; CHECK-LABEL: @nonnull5 +; CHECK: !nonnull +; CHECK-NOT: call void @llvm.assume +} + +declare i32* @llvm.noalias.p0i32(i32*, metadata) nounwind + +!0 = !{!0, !"some domain"} +!1 = !{!1, !0, !"some scope"} attributes #0 = { nounwind uwtable } attributes #1 = { nounwind }