[llvm] 516333d - [ValueTracking] Handle non-pow2 align assume bundle (PR53693)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 5 07:51:04 PDT 2022
Author: Nikita Popov
Date: 2022-04-05T16:48:40+02:00
New Revision: 516333d632ea7fc9f328520ac46337b7494271d4
URL: https://github.com/llvm/llvm-project/commit/516333d632ea7fc9f328520ac46337b7494271d4
DIFF: https://github.com/llvm/llvm-project/commit/516333d632ea7fc9f328520ac46337b7494271d4.diff
LOG: [ValueTracking] Handle non-pow2 align assume bundle (PR53693)
https://reviews.llvm.org/D119414 clarified that this is legal IR,
so handle it gracefully. (We could aggressively use the fact that
the pointer must be a null pointer in that case, but I'm not
bothering with that.)
Fixes https://github.com/llvm/llvm-project/issues/53693.
Added:
Modified:
llvm/lib/Analysis/ValueTracking.cpp
llvm/test/Transforms/InstCombine/assume-align.ll
Removed:
################################################################################
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index 67fe15fd23b36..75381f5f7e5fb 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -671,7 +671,8 @@ static void computeKnownBitsFromAssume(const Value *V, KnownBits &Known,
if (V->getType()->isPointerTy()) {
if (RetainedKnowledge RK = getKnowledgeValidInContext(
V, {Attribute::Alignment}, Q.CxtI, Q.DT, Q.AC)) {
- Known.Zero.setLowBits(Log2_64(RK.ArgValue));
+ if (isPowerOf2_64(RK.ArgValue))
+ Known.Zero.setLowBits(Log2_64(RK.ArgValue));
}
}
diff --git a/llvm/test/Transforms/InstCombine/assume-align.ll b/llvm/test/Transforms/InstCombine/assume-align.ll
index fbe884b672ab6..b6e66c23ee03c 100644
--- a/llvm/test/Transforms/InstCombine/assume-align.ll
+++ b/llvm/test/Transforms/InstCombine/assume-align.ll
@@ -105,3 +105,24 @@ define void @f3(i64 %a, i8* %b) {
declare void @g(i64)
+define i8 @assume_align_zero(i8* %p) {
+; CHECK-LABEL: @assume_align_zero(
+; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(i8* [[P:%.*]], i64 0) ]
+; CHECK-NEXT: [[V:%.*]] = load i8, i8* [[P]], align 1
+; CHECK-NEXT: ret i8 [[V]]
+;
+ call void @llvm.assume(i1 true) [ "align"(i8* %p, i64 0) ]
+ %v = load i8, i8* %p
+ ret i8 %v
+}
+
+define i8 @assume_align_non_pow2(i8* %p) {
+; CHECK-LABEL: @assume_align_non_pow2(
+; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(i8* [[P:%.*]], i64 123) ]
+; CHECK-NEXT: [[V:%.*]] = load i8, i8* [[P]], align 1
+; CHECK-NEXT: ret i8 [[V]]
+;
+ call void @llvm.assume(i1 true) [ "align"(i8* %p, i64 123) ]
+ %v = load i8, i8* %p
+ ret i8 %v
+}
More information about the llvm-commits
mailing list