[llvm] [ValueTracking] Make use of the offset argument in align assume bundles (PR #203497)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 12 03:40:42 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-transforms
Author: Nikolas Klauser (philnik777)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/203497.diff
2 Files Affected:
- (modified) llvm/lib/Analysis/ValueTracking.cpp (+5-5)
- (modified) llvm/test/Transforms/InstCombine/assume-align.ll (-12)
``````````diff
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:
``````````
</details>
https://github.com/llvm/llvm-project/pull/203497
More information about the llvm-commits
mailing list