Index: lib/Analysis/ValueTracking.cpp =================================================================== --- lib/Analysis/ValueTracking.cpp +++ lib/Analysis/ValueTracking.cpp @@ -1288,6 +1288,9 @@ if (IntrinsicInst *II = dyn_cast(I)) { switch (II->getIntrinsicID()) { default: break; + case Intrinsic::noalias: + computeKnownBits(I->getOperand(0), KnownZero, KnownOne, Depth + 1, Q); + break; case Intrinsic::bswap: computeKnownBits(I->getOperand(0), KnownZero2, KnownOne2, Depth + 1, Q); KnownZero |= KnownZero2.byteSwap(); Index: test/Transforms/InstCombine/align-attr.ll =================================================================== --- test/Transforms/InstCombine/align-attr.ll +++ test/Transforms/InstCombine/align-attr.ll @@ -13,3 +13,19 @@ ; CHECK: ret i32 } +define i32 @foo2(i32* align 32 %a) #0 { +entry: + %v = call i32* @llvm.noalias.p0i32(i32* %a, metadata !1) + %0 = load i32, i32* %v, align 4 + ret i32 %0 + +; CHECK-LABEL: @foo2 +; CHECK-DAG: load i32, i32* %v, align 32 +; CHECK: ret i32 +} + +declare i32* @llvm.noalias.p0i32(i32*, metadata) nounwind + +!0 = !{!0, !"some domain"} +!1 = !{!1, !0, !"some scope"} +