Skip to content

Commit d46d99c

Browse files
authored
[InferAlign] Eliminate and ptr, -align pattern (#171147)
To complement the `and ptr, align-1 -> 0` pattern, also fold `and ptr, -align` to `ptr`. Proof: https://alive2.llvm.org/ce/z/TbeG6d
1 parent ad29ee5 commit d46d99c

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

llvm/lib/Transforms/Scalar/InferAlignment.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@ static bool tryToImproveAlign(
5050
I->replaceAllUsesWith(Constant::getNullValue(I->getType()));
5151
return true;
5252
}
53+
if (Const->uge(
54+
APInt::getBitsSetFrom(Const->getBitWidth(), Log2(ActualAlign)))) {
55+
I->replaceAllUsesWith(I->getOperand(0));
56+
return true;
57+
}
5358
}
5459

5560
IntrinsicInst *II = dyn_cast<IntrinsicInst>(I);

llvm/test/Transforms/InferAlignment/ptrtoint.ll

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,45 @@ define i64 @ptrtoaddr(ptr %ptr) {
6262
%v5 = and i64 %v3, 2
6363
ret i64 %v5
6464
}
65+
66+
define i64 @redundant_mask(ptr %ptr) {
67+
; CHECK-LABEL: define i64 @redundant_mask(
68+
; CHECK-SAME: ptr [[PTR:%.*]]) {
69+
; CHECK-NEXT: [[LOAD:%.*]] = load i32, ptr [[PTR]], align 4
70+
; CHECK-NEXT: [[INT:%.*]] = ptrtoint ptr [[PTR]] to i64
71+
; CHECK-NEXT: [[MASK:%.*]] = and i64 [[INT]], -4
72+
; CHECK-NEXT: ret i64 [[INT]]
73+
;
74+
%load = load i32, ptr %ptr, align 4
75+
%int = ptrtoint ptr %ptr to i64
76+
%mask = and i64 %int, -4
77+
ret i64 %mask
78+
}
79+
80+
define i64 @redundant_mask2(ptr %ptr) {
81+
; CHECK-LABEL: define i64 @redundant_mask2(
82+
; CHECK-SAME: ptr [[PTR:%.*]]) {
83+
; CHECK-NEXT: [[LOAD:%.*]] = load i32, ptr [[PTR]], align 4
84+
; CHECK-NEXT: [[INT:%.*]] = ptrtoint ptr [[PTR]] to i64
85+
; CHECK-NEXT: [[MASK:%.*]] = and i64 [[INT]], -3
86+
; CHECK-NEXT: ret i64 [[INT]]
87+
;
88+
%load = load i32, ptr %ptr, align 4
89+
%int = ptrtoint ptr %ptr to i64
90+
%mask = and i64 %int, -3
91+
ret i64 %mask
92+
}
93+
94+
define i64 @not_redundant_mask(ptr %ptr) {
95+
; CHECK-LABEL: define i64 @not_redundant_mask(
96+
; CHECK-SAME: ptr [[PTR:%.*]]) {
97+
; CHECK-NEXT: [[LOAD:%.*]] = load i32, ptr [[PTR]], align 4
98+
; CHECK-NEXT: [[INT:%.*]] = ptrtoint ptr [[PTR]] to i64
99+
; CHECK-NEXT: [[MASK:%.*]] = and i64 [[INT]], -5
100+
; CHECK-NEXT: ret i64 [[MASK]]
101+
;
102+
%load = load i32, ptr %ptr, align 4
103+
%int = ptrtoint ptr %ptr to i64
104+
%mask = and i64 %int, -5
105+
ret i64 %mask
106+
}

0 commit comments

Comments
 (0)