[llvm] [ValueTracking] Infer nonnull from alignment with non-zero offsets (PR #203634)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 12 14:07:23 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-analysis
Author: Nikolas Klauser (philnik777)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/203634.diff
2 Files Affected:
- (modified) llvm/lib/IR/BundleAttributes.cpp (+6)
- (modified) llvm/test/Analysis/ValueTracking/assume.ll (+21)
``````````diff
diff --git a/llvm/lib/IR/BundleAttributes.cpp b/llvm/lib/IR/BundleAttributes.cpp
index a05a11daab3f2..d57e23ebc06ba 100644
--- a/llvm/lib/IR/BundleAttributes.cpp
+++ b/llvm/lib/IR/BundleAttributes.cpp
@@ -76,6 +76,12 @@ llvm::getAssumeDereferenceableInfo(OperandBundleUse OBU) {
bool llvm::assumeBundleImpliesNonNull(const Value *Val, const Function *Context,
OperandBundleUse OBU) {
switch (getBundleAttrFromOBU(OBU)) {
+ case BundleAttr::Align: {
+ auto [Ptr, _, Alignment, Offset] = getAssumeAlignInfo(OBU);
+ return Ptr == Val && Alignment && Offset && isPowerOf2_64(*Alignment) &&
+ *Offset % *Alignment != 0;
+ }
+
case BundleAttr::Dereferenceable: {
auto [Ptr, _, Count] = getAssumeDereferenceableInfo(OBU);
return Ptr == Val && Count && *Count != 0 &&
diff --git a/llvm/test/Analysis/ValueTracking/assume.ll b/llvm/test/Analysis/ValueTracking/assume.ll
index 09efbdac20cf4..36fa135a184d3 100644
--- a/llvm/test/Analysis/ValueTracking/assume.ll
+++ b/llvm/test/Analysis/ValueTracking/assume.ll
@@ -259,3 +259,24 @@ define i1 @test_align_with_variable_offset(ptr %ptr, i64 %offset) {
%is_aligned = icmp eq i64 %and, 0
ret i1 %is_aligned
}
+
+define i1 @align_with_non_zero_offset_is_nonnull(ptr %ptr) {
+; CHECK-LABEL: @align_with_non_zero_offset_is_nonnull(
+; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR:%.*]], i64 4, i64 1) ]
+; CHECK-NEXT: ret i1 false
+;
+ call void @llvm.assume(i1 true) ["align"(ptr %ptr, i64 4, i64 1)]
+ %is_null = icmp eq ptr %ptr, null
+ ret i1 %is_null
+}
+
+define i1 @align_with_zero_offset_might_be_null(ptr %ptr) {
+; CHECK-LABEL: @align_with_zero_offset_might_be_null(
+; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR:%.*]], i64 4, i64 0) ]
+; CHECK-NEXT: [[IS_NULL:%.*]] = icmp eq ptr [[PTR]], null
+; CHECK-NEXT: ret i1 [[IS_NULL]]
+;
+ call void @llvm.assume(i1 true) ["align"(ptr %ptr, i64 4, i64 0)]
+ %is_null = icmp eq ptr %ptr, null
+ ret i1 %is_null
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/203634
More information about the llvm-commits
mailing list