Index: llvm/lib/Analysis/ValueTracking.cpp =================================================================== --- llvm/lib/Analysis/ValueTracking.cpp +++ llvm/lib/Analysis/ValueTracking.cpp @@ -513,6 +513,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: llvm/test/Transforms/InstCombine/assume.ll =================================================================== --- llvm/test/Transforms/InstCombine/assume.ll +++ llvm/test/Transforms/InstCombine/assume.ll @@ -339,6 +339,24 @@ declare void @llvm.dbg.value(metadata, metadata, metadata) +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 + !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!5, !6, !7, !8} @@ -351,6 +369,8 @@ !7 = !{i32 1, !"wchar_size", i32 4} !8 = !{i32 7, !"PIC Level", i32 2} !9 = !DILocation(line: 0, column: 0, scope: !2) +!10 = !{!10, !"some domain"} +!11 = !{!11, !10, !"some scope"} attributes #0 = { nounwind uwtable }