[llvm] [ValueTracking] Make use of the offset argument in align assume bundles (PR #203497)
Nikolas Klauser via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 12 04:28:39 PDT 2026
https://github.com/philnik777 updated https://github.com/llvm/llvm-project/pull/203497
>From e02303fdaa567a8a984043c617aa184d366a5168 Mon Sep 17 00:00:00 2001
From: Nikolas Klauser <nikolasklauser at berlin.de>
Date: Fri, 12 Jun 2026 12:39:42 +0200
Subject: [PATCH 1/2] [ValueTracking] Make use of the offset argument in align
assume bundles
---
llvm/lib/Analysis/ValueTracking.cpp | 10 +++++-----
llvm/test/Transforms/InstCombine/assume-align.ll | 12 ------------
2 files changed, 5 insertions(+), 17 deletions(-)
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index 763620b353bb5..04695db215c73 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -1091,11 +1091,11 @@ void llvm::computeKnownBitsFromContext(const Value *V, KnownBits &Known,
if (auto OBU = I->getOperandBundleAt(Elem.Index);
getBundleAttrFromOBU(OBU) == BundleAttr::Align) {
auto [Ptr, _, Alignment, Offset] = getAssumeAlignInfo(OBU);
- if (Ptr != V || !Alignment || !Offset || !isPowerOf2_64(*Alignment))
- continue;
- auto AlignVal = MinAlign(*Offset, *Alignment);
- if (isValidAssumeForContext(I, Q))
- Known.Zero.setLowBits(Log2_64(AlignVal));
+ if (Ptr == V && Alignment && Offset && isPowerOf2_64(*Alignment) &&
+ isValidAssumeForContext(I, Q)) {
+ Known.Zero |= (*Alignment - 1) & ~*Offset;
+ Known.One |= (*Alignment - 1) & *Offset;
+ }
}
continue;
}
diff --git a/llvm/test/Transforms/InstCombine/assume-align.ll b/llvm/test/Transforms/InstCombine/assume-align.ll
index 226f387b20fbb..e0adb26d47813 100644
--- a/llvm/test/Transforms/InstCombine/assume-align.ll
+++ b/llvm/test/Transforms/InstCombine/assume-align.ll
@@ -44,24 +44,12 @@ if.end: ; preds = %if.then1, %if.else1
ret void
}
-; TODO: We could fold away the branch "br i1 %3, ..." by either using a GEP or make getKnowledgeValidInContext aware the alignment bundle offset, and the improvement of value tracking of GEP.
-
define void @f2(ptr %a) {
; CHECK-LABEL: @f2(
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A:%.*]], i64 32, i32 24) ]
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw i8, ptr [[A]], i64 8
-; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[TMP0]] to i64
-; CHECK-NEXT: [[TMP2:%.*]] = and i64 [[TMP1]], 8
-; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i64 [[TMP2]], 0
-; CHECK-NEXT: br i1 [[TMP3]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
-; CHECK: if.then:
; CHECK-NEXT: store i64 16, ptr [[TMP0]], align 4
-; CHECK-NEXT: br label [[IF_END:%.*]]
-; CHECK: if.else:
-; CHECK-NEXT: store i8 1, ptr [[TMP0]], align 1
-; CHECK-NEXT: br label [[IF_END]]
-; CHECK: if.end:
; CHECK-NEXT: ret void
;
entry:
>From a5040674fd9ec0007fed8779edfea376d3ad188b Mon Sep 17 00:00:00 2001
From: Nikolas Klauser <nikolasklauser at berlin.de>
Date: Fri, 12 Jun 2026 13:28:28 +0200
Subject: [PATCH 2/2] Fix CI
---
llvm/test/Analysis/ValueTracking/assume.ll | 10 ++--------
1 file changed, 2 insertions(+), 8 deletions(-)
diff --git a/llvm/test/Analysis/ValueTracking/assume.ll b/llvm/test/Analysis/ValueTracking/assume.ll
index 09efbdac20cf4..688506332df4d 100644
--- a/llvm/test/Analysis/ValueTracking/assume.ll
+++ b/llvm/test/Analysis/ValueTracking/assume.ll
@@ -206,10 +206,7 @@ define i1 @test_align_with_constant_offset_0(ptr %ptr) {
define i1 @test_align_with_constant_offset_1(ptr %ptr) {
; CHECK-LABEL: @test_align_with_constant_offset_1(
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR:%.*]], i64 8, i64 1) ]
-; CHECK-NEXT: [[INTPTR:%.*]] = ptrtoint ptr [[PTR]] to i64
-; CHECK-NEXT: [[AND:%.*]] = and i64 [[INTPTR]], 7
-; CHECK-NEXT: [[IS_ALIGNED:%.*]] = icmp eq i64 [[AND]], 0
-; CHECK-NEXT: ret i1 [[IS_ALIGNED]]
+; CHECK-NEXT: ret i1 false
;
call void @llvm.assume(i1 true) ["align"(ptr %ptr, i64 8, i64 1)]
%intptr = ptrtoint ptr %ptr to i64
@@ -221,10 +218,7 @@ define i1 @test_align_with_constant_offset_1(ptr %ptr) {
define i1 @test_align_with_constant_offset_4(ptr %ptr) {
; CHECK-LABEL: @test_align_with_constant_offset_4(
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR:%.*]], i64 8, i64 4) ]
-; CHECK-NEXT: [[INTPTR:%.*]] = ptrtoint ptr [[PTR]] to i64
-; CHECK-NEXT: [[AND:%.*]] = and i64 [[INTPTR]], 4
-; CHECK-NEXT: [[IS_ALIGNED:%.*]] = icmp eq i64 [[AND]], 0
-; CHECK-NEXT: ret i1 [[IS_ALIGNED]]
+; CHECK-NEXT: ret i1 false
;
call void @llvm.assume(i1 true) ["align"(ptr %ptr, i64 8, i64 4)]
%intptr = ptrtoint ptr %ptr to i64
More information about the llvm-commits
mailing list