Skip to content

Conversation

@nikic
Copy link
Contributor

@nikic nikic commented Dec 8, 2025

To complement the and ptr, align-1 -> 0 pattern, also fold and ptr, -align to ptr.
Proof: https://alive2.llvm.org/ce/z/TbeG6d

To complement the `and ptr, align-1 -> 0` pattern, also fold
`and ptr, -align` to `ptr`.
@llvmbot
Copy link
Member

llvmbot commented Dec 8, 2025

@llvm/pr-subscribers-llvm-transforms

Author: Nikita Popov (nikic)

Changes

To complement the and ptr, align-1 -> 0 pattern, also fold and ptr, -align to ptr.


Full diff: https://github.com/llvm/llvm-project/pull/171147.diff

2 Files Affected:

  • (modified) llvm/lib/Transforms/Scalar/InferAlignment.cpp (+5)
  • (modified) llvm/test/Transforms/InferAlignment/ptrtoint.ll (+42)
diff --git a/llvm/lib/Transforms/Scalar/InferAlignment.cpp b/llvm/lib/Transforms/Scalar/InferAlignment.cpp
index c0a147ed78231..93de58f7c8062 100644
--- a/llvm/lib/Transforms/Scalar/InferAlignment.cpp
+++ b/llvm/lib/Transforms/Scalar/InferAlignment.cpp
@@ -50,6 +50,11 @@ static bool tryToImproveAlign(
       I->replaceAllUsesWith(Constant::getNullValue(I->getType()));
       return true;
     }
+    if (Const->uge(
+            APInt::getBitsSetFrom(Const->getBitWidth(), Log2(ActualAlign)))) {
+      I->replaceAllUsesWith(I->getOperand(0));
+      return true;
+    }
   }
 
   IntrinsicInst *II = dyn_cast<IntrinsicInst>(I);
diff --git a/llvm/test/Transforms/InferAlignment/ptrtoint.ll b/llvm/test/Transforms/InferAlignment/ptrtoint.ll
index 3eb1f95d9c026..e4b30330e2220 100644
--- a/llvm/test/Transforms/InferAlignment/ptrtoint.ll
+++ b/llvm/test/Transforms/InferAlignment/ptrtoint.ll
@@ -62,3 +62,45 @@ define i64 @ptrtoaddr(ptr %ptr) {
   %v5 = and i64 %v3, 2
   ret i64 %v5
 }
+
+define i64 @redundant_mask(ptr %ptr) {
+; CHECK-LABEL: define i64 @redundant_mask(
+; CHECK-SAME: ptr [[PTR:%.*]]) {
+; CHECK-NEXT:    [[LOAD:%.*]] = load i32, ptr [[PTR]], align 4
+; CHECK-NEXT:    [[INT:%.*]] = ptrtoint ptr [[PTR]] to i64
+; CHECK-NEXT:    [[MASK:%.*]] = and i64 [[INT]], -4
+; CHECK-NEXT:    ret i64 [[INT]]
+;
+  %load = load i32, ptr %ptr, align 4
+  %int = ptrtoint ptr %ptr to i64
+  %mask = and i64 %int, -4
+  ret i64 %mask
+}
+
+define i64 @redundant_mask2(ptr %ptr) {
+; CHECK-LABEL: define i64 @redundant_mask2(
+; CHECK-SAME: ptr [[PTR:%.*]]) {
+; CHECK-NEXT:    [[LOAD:%.*]] = load i32, ptr [[PTR]], align 4
+; CHECK-NEXT:    [[INT:%.*]] = ptrtoint ptr [[PTR]] to i64
+; CHECK-NEXT:    [[MASK:%.*]] = and i64 [[INT]], -3
+; CHECK-NEXT:    ret i64 [[INT]]
+;
+  %load = load i32, ptr %ptr, align 4
+  %int = ptrtoint ptr %ptr to i64
+  %mask = and i64 %int, -3
+  ret i64 %mask
+}
+
+define i64 @not_redundant_mask(ptr %ptr) {
+; CHECK-LABEL: define i64 @not_redundant_mask(
+; CHECK-SAME: ptr [[PTR:%.*]]) {
+; CHECK-NEXT:    [[LOAD:%.*]] = load i32, ptr [[PTR]], align 4
+; CHECK-NEXT:    [[INT:%.*]] = ptrtoint ptr [[PTR]] to i64
+; CHECK-NEXT:    [[MASK:%.*]] = and i64 [[INT]], -5
+; CHECK-NEXT:    ret i64 [[MASK]]
+;
+  %load = load i32, ptr %ptr, align 4
+  %int = ptrtoint ptr %ptr to i64
+  %mask = and i64 %int, -5
+  ret i64 %mask
+}

@nikic nikic requested a review from dtcxzyw December 8, 2025 15:58
@nikic
Copy link
Contributor Author

nikic commented Dec 8, 2025

This is a small extension to #166935.

Copy link
Member

@dtcxzyw dtcxzyw left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@nikic nikic merged commit d46d99c into llvm:main Dec 9, 2025
14 checks passed
@nikic nikic deleted the inferalign-and branch December 9, 2025 07:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants