[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