Skip to content

Commit d49c6d5

Browse files
committed
[InstCombine] Fold align assume into load's !align metadata if possible.
1 parent 3ab076c commit d49c6d5

File tree

3 files changed

+35
-19
lines changed

3 files changed

+35
-19
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3446,9 +3446,18 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
34463446
KnownBits Known = computeKnownBits(RK.WasOn, /*CtxI=*/nullptr);
34473447
unsigned TZ = std::min(Known.countMinTrailingZeros(),
34483448
Value::MaxAlignmentExponent);
3449-
if ((1ULL << TZ) < RK.ArgValue)
3450-
continue;
3451-
return CallBase::removeOperandBundle(II, OBU.getTagID());
3449+
if ((1ULL << TZ) >= RK.ArgValue)
3450+
return CallBase::removeOperandBundle(II, OBU.getTagID());
3451+
3452+
auto *LI = dyn_cast<LoadInst>(OBU.Inputs[0]);
3453+
if (LI &&
3454+
isValidAssumeForContext(II, LI, &DT, /*AllowEphemerals=*/true)) {
3455+
LI->setMetadata(LLVMContext::MD_align,
3456+
MDNode::get(II->getContext(),
3457+
ValueAsMetadata::getConstant(
3458+
Builder.getInt64(RK.ArgValue))));
3459+
return CallBase::removeOperandBundle(II, OBU.getTagID());
3460+
}
34523461
}
34533462
}
34543463

llvm/test/Transforms/InstCombine/assume-align.ll

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -123,18 +123,26 @@ define i8 @assume_align_non_pow2(ptr %p) {
123123
ret i8 %v
124124
}
125125

126-
; TODO: Can fold alignment assumption into !align metadata on load.
127126
define ptr @fold_assume_align_pow2_of_loaded_pointer_into_align_metadata(ptr %p) {
128127
; CHECK-LABEL: @fold_assume_align_pow2_of_loaded_pointer_into_align_metadata(
129-
; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P:%.*]], align 8
130-
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[P2]], i64 8) ]
128+
; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P:%.*]], align 8, !align [[META0:![0-9]+]]
131129
; CHECK-NEXT: ret ptr [[P2]]
132130
;
133131
%p2 = load ptr, ptr %p
134132
call void @llvm.assume(i1 true) [ "align"(ptr %p2, i64 8) ]
135133
ret ptr %p2
136134
}
137135

136+
define ptr @fold_assume_align_i32_pow2_of_loaded_pointer_into_align_metadata(ptr %p) {
137+
; CHECK-LABEL: @fold_assume_align_i32_pow2_of_loaded_pointer_into_align_metadata(
138+
; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P:%.*]], align 8, !align [[META0]]
139+
; CHECK-NEXT: ret ptr [[P2]]
140+
;
141+
%p2 = load ptr, ptr %p
142+
call void @llvm.assume(i1 true) [ "align"(ptr %p2, i32 8) ]
143+
ret ptr %p2
144+
}
145+
138146
define ptr @dont_fold_assume_align_pow2_of_loaded_pointer_into_align_metadata_due_to_call(ptr %p) {
139147
; CHECK-LABEL: @dont_fold_assume_align_pow2_of_loaded_pointer_into_align_metadata_due_to_call(
140148
; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P:%.*]], align 8
@@ -187,7 +195,7 @@ define ptr @redundant_assume_align_1(ptr %p) {
187195

188196
define ptr @redundant_assume_align_8_via_align_metadata(ptr %p) {
189197
; CHECK-LABEL: @redundant_assume_align_8_via_align_metadata(
190-
; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P:%.*]], align 8, !align [[META0:![0-9]+]]
198+
; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P:%.*]], align 8, !align [[META0]]
191199
; CHECK-NEXT: call void @foo(ptr [[P2]])
192200
; CHECK-NEXT: ret ptr [[P2]]
193201
;
@@ -199,8 +207,7 @@ define ptr @redundant_assume_align_8_via_align_metadata(ptr %p) {
199207

200208
define ptr @assume_align_16_via_align_metadata(ptr %p) {
201209
; CHECK-LABEL: @assume_align_16_via_align_metadata(
202-
; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P:%.*]], align 8, !align [[META0]]
203-
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[P2]], i32 16) ]
210+
; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P:%.*]], align 8, !align [[META1:![0-9]+]]
204211
; CHECK-NEXT: call void @foo(ptr [[P2]])
205212
; CHECK-NEXT: ret ptr [[P2]]
206213
;
@@ -283,4 +290,5 @@ define ptr @assume_load_pointer_result(ptr %p, i64 %align) {
283290

284291
;.
285292
; CHECK: [[META0]] = !{i64 8}
293+
; CHECK: [[META1]] = !{i64 16}
286294
;.

llvm/test/Transforms/PhaseOrdering/AArch64/infer-align-from-assumption.ll

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,13 @@ declare void @llvm.assume(i1 noundef)
88
define i32 @earlycse_entry(ptr %p) {
99
; CHECK-LABEL: define i32 @earlycse_entry(
1010
; CHECK-SAME: ptr captures(none) [[P:%.*]]) local_unnamed_addr {
11-
; CHECK-NEXT: [[L_I:%.*]] = load ptr, ptr [[P]], align 8
12-
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[L_I]], i64 4) ]
11+
; CHECK-NEXT: [[L_I:%.*]] = load ptr, ptr [[P]], align 8, !align [[META0:![0-9]+]]
1312
; CHECK-NEXT: [[L_ASSUME_ALIGNED_I_I:%.*]] = load i32, ptr [[L_I]], align 4
1413
; CHECK-NEXT: [[R_I_I:%.*]] = tail call i32 @swap(i32 [[L_ASSUME_ALIGNED_I_I]])
1514
; CHECK-NEXT: [[L_2_I:%.*]] = load ptr, ptr [[P]], align 8
1615
; CHECK-NEXT: [[GEP_I:%.*]] = getelementptr i8, ptr [[L_2_I]], i64 4
1716
; CHECK-NEXT: store ptr [[GEP_I]], ptr [[P]], align 8
18-
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[GEP_I]], i64 4) ]
19-
; CHECK-NEXT: [[L_ASSUME_ALIGNED_I_I2:%.*]] = load i32, ptr [[GEP_I]], align 4
17+
; CHECK-NEXT: [[L_ASSUME_ALIGNED_I_I2:%.*]] = load i32, ptr [[GEP_I]], align 1
2018
; CHECK-NEXT: [[R_I_I3:%.*]] = tail call i32 @swap(i32 [[L_ASSUME_ALIGNED_I_I2]])
2119
; CHECK-NEXT: [[L_2_I4:%.*]] = load ptr, ptr [[P]], align 8
2220
; CHECK-NEXT: [[GEP_I5:%.*]] = getelementptr i8, ptr [[L_2_I4]], i64 4
@@ -31,8 +29,7 @@ define i32 @earlycse_entry(ptr %p) {
3129
define i32 @earlycse_fn1(ptr %p) {
3230
; CHECK-LABEL: define i32 @earlycse_fn1(
3331
; CHECK-SAME: ptr captures(none) [[P:%.*]]) local_unnamed_addr {
34-
; CHECK-NEXT: [[L:%.*]] = load ptr, ptr [[P]], align 8
35-
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[L]], i64 4) ]
32+
; CHECK-NEXT: [[L:%.*]] = load ptr, ptr [[P]], align 8, !align [[META0]]
3633
; CHECK-NEXT: [[L_ASSUME_ALIGNED_I:%.*]] = load i32, ptr [[L]], align 4
3734
; CHECK-NEXT: [[R_I:%.*]] = tail call i32 @swap(i32 [[L_ASSUME_ALIGNED_I]])
3835
; CHECK-NEXT: [[L_2:%.*]] = load ptr, ptr [[P]], align 8
@@ -67,8 +64,7 @@ declare i32 @swap(i32)
6764
define void @sroa_align_entry(ptr %p) {
6865
; CHECK-LABEL: define void @sroa_align_entry(
6966
; CHECK-SAME: ptr readonly captures(none) [[P:%.*]]) local_unnamed_addr #[[ATTR1:[0-9]+]] {
70-
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[P]], i64 8) ]
71-
; CHECK-NEXT: [[DOT0_COPYLOAD_I_I_I:%.*]] = load i64, ptr [[P]], align 8
67+
; CHECK-NEXT: [[DOT0_COPYLOAD_I_I_I:%.*]] = load i64, ptr [[P]], align 1
7268
; CHECK-NEXT: [[TMP2:%.*]] = inttoptr i64 [[DOT0_COPYLOAD_I_I_I]] to ptr
7369
; CHECK-NEXT: store i32 0, ptr [[TMP2]], align 4
7470
; CHECK-NEXT: ret void
@@ -83,8 +79,7 @@ define void @sroa_align_entry(ptr %p) {
8379
define ptr @sroa_fn1(ptr %p) {
8480
; CHECK-LABEL: define ptr @sroa_fn1(
8581
; CHECK-SAME: ptr readonly captures(none) [[P:%.*]]) local_unnamed_addr #[[ATTR2:[0-9]+]] {
86-
; CHECK-NEXT: [[L:%.*]] = load ptr, ptr [[P]], align 8
87-
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[L]], i64 8) ]
82+
; CHECK-NEXT: [[L:%.*]] = load ptr, ptr [[P]], align 8, !align [[META1:![0-9]+]]
8883
; CHECK-NEXT: [[L_FN3_I_I:%.*]] = load i64, ptr [[L]], align 8
8984
; CHECK-NEXT: [[I_I:%.*]] = inttoptr i64 [[L_FN3_I_I]] to ptr
9085
; CHECK-NEXT: ret ptr [[I_I]]
@@ -118,3 +113,7 @@ define i64 @sroa_fn3(ptr %0) {
118113
%l.fn3 = load i64, ptr %0, align 1
119114
ret i64 %l.fn3
120115
}
116+
;.
117+
; CHECK: [[META0]] = !{i64 4}
118+
; CHECK: [[META1]] = !{i64 8}
119+
;.

0 commit comments

Comments
 (0)