diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -666,7 +666,8 @@ if (V->getType()->isPointerTy()) { if (RetainedKnowledge RK = getKnowledgeValidInContext( V, {Attribute::Alignment}, Q.CxtI, Q.DT, Q.AC)) { - Known.Zero.setLowBits(Log2_32(RK.ArgValue)); + if (RK.ArgValue) + Known.Zero.setLowBits(Log2_32(RK.ArgValue)); } } diff --git a/llvm/test/Analysis/ValueTracking/pr48713.ll b/llvm/test/Analysis/ValueTracking/pr48713.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Analysis/ValueTracking/pr48713.ll @@ -0,0 +1,11 @@ +; RUN: opt -instsimplify < %s + +define i8* @PR48713() { + %call = call i8* @PR48713() + call void @llvm.assume(i1 true) [ "align"(i8* %call, i64 0) ] + %cmp = icmp eq i8* %call, null + %conv = zext i1 %cmp to i32 + ret i8* null +} + +declare void @llvm.assume(i1 noundef)