Skip to content

Commit b1339ab

Browse files
committed
[InstCombine] Add tests for folding align assumes into load metadata.
1 parent ce73407 commit b1339ab

File tree

1 file changed

+50
-1
lines changed

1 file changed

+50
-1
lines changed

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

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals smart
22
; RUN: opt -S -passes=instcombine,simplifycfg < %s 2>&1 | FileCheck %s
33

44
declare void @llvm.assume(i1 noundef)
@@ -122,3 +122,52 @@ define i8 @assume_align_non_pow2(ptr %p) {
122122
%v = load i8, ptr %p
123123
ret i8 %v
124124
}
125+
126+
; TODO: Can fold alignment assumption into !align metadata on load.
127+
define ptr @fold_assume_align_pow2_of_loaded_pointer_into_align_metadata(ptr %p) {
128+
; 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) ]
131+
; CHECK-NEXT: ret ptr [[P2]]
132+
;
133+
%p2 = load ptr, ptr %p
134+
call void @llvm.assume(i1 true) [ "align"(ptr %p2, i64 8) ]
135+
ret ptr %p2
136+
}
137+
138+
define ptr @dont_fold_assume_align_pow2_of_loaded_pointer_into_align_metadata_due_to_call(ptr %p) {
139+
; CHECK-LABEL: @dont_fold_assume_align_pow2_of_loaded_pointer_into_align_metadata_due_to_call(
140+
; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P:%.*]], align 8
141+
; CHECK-NEXT: call void @g(i64 0)
142+
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[P2]], i64 8) ]
143+
; CHECK-NEXT: ret ptr [[P2]]
144+
;
145+
%p2 = load ptr, ptr %p
146+
call void @g(i64 0)
147+
call void @llvm.assume(i1 true) [ "align"(ptr %p2, i64 8) ]
148+
ret ptr %p2
149+
}
150+
151+
; !align must have a power-of-2 alignment.
152+
define ptr @dont_fold_assume_align_non_pow2_of_loaded_pointer_into_align_metadata(ptr %p) {
153+
; CHECK-LABEL: @dont_fold_assume_align_non_pow2_of_loaded_pointer_into_align_metadata(
154+
; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P:%.*]], align 8
155+
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[P2]], i64 13) ]
156+
; CHECK-NEXT: ret ptr [[P2]]
157+
;
158+
%p2 = load ptr, ptr %p
159+
call void @llvm.assume(i1 true) [ "align"(ptr %p2, i64 13) ]
160+
ret ptr %p2
161+
}
162+
163+
; !align must have a power-of-2 alignment.
164+
define ptr @dont_fold_assume_align_zero_of_loaded_pointer_into_align_metadata(ptr %p) {
165+
; CHECK-LABEL: @dont_fold_assume_align_zero_of_loaded_pointer_into_align_metadata(
166+
; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P:%.*]], align 8
167+
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[P2]], i64 0) ]
168+
; CHECK-NEXT: ret ptr [[P2]]
169+
;
170+
%p2 = load ptr, ptr %p
171+
call void @llvm.assume(i1 true) [ "align"(ptr %p2, i64 0) ]
172+
ret ptr %p2
173+
}

0 commit comments

Comments
 (0)