Skip to content

Commit 1aff96b

Browse files
committed
[InstCombine] Add extra tests for preserving load metadata.
Test cases for #115595.
1 parent 5811067 commit 1aff96b

File tree

2 files changed

+348
-9
lines changed

2 files changed

+348
-9
lines changed

llvm/test/Transforms/InstCombine/loadstore-metadata.ll

Lines changed: 97 additions & 9 deletions
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 -passes=instcombine -S < %s | FileCheck %s
33

44
target datalayout = "e-m:e-p:64:64:64-i64:64-f80:128-n8:16:32:64-S128"
@@ -20,7 +20,7 @@ define i32 @test_load_cast_combine_noalias(ptr %ptr) {
2020
; Ensure (cast (load (...))) -> (load (cast (...))) preserves no-alias metadata.
2121
; CHECK-LABEL: @test_load_cast_combine_noalias(
2222
; CHECK-NEXT: entry:
23-
; CHECK-NEXT: [[L1:%.*]] = load i32, ptr [[PTR:%.*]], align 4, !alias.scope !3, !noalias !3
23+
; CHECK-NEXT: [[L1:%.*]] = load i32, ptr [[PTR:%.*]], align 4, !alias.scope [[META3:![0-9]+]], !noalias [[META3]]
2424
; CHECK-NEXT: ret i32 [[L1]]
2525
;
2626
entry:
@@ -48,7 +48,7 @@ define i32 @test_load_cast_combine_invariant(ptr %ptr) {
4848
; Ensure (cast (load (...))) -> (load (cast (...))) preserves invariant metadata.
4949
; CHECK-LABEL: @test_load_cast_combine_invariant(
5050
; CHECK-NEXT: entry:
51-
; CHECK-NEXT: [[L1:%.*]] = load i32, ptr [[PTR:%.*]], align 4, !invariant.load !6
51+
; CHECK-NEXT: [[L1:%.*]] = load i32, ptr [[PTR:%.*]], align 4, !invariant.load [[META6:![0-9]+]]
5252
; CHECK-NEXT: ret i32 [[L1]]
5353
;
5454
entry:
@@ -62,7 +62,7 @@ define i32 @test_load_cast_combine_nontemporal(ptr %ptr) {
6262
; metadata.
6363
; CHECK-LABEL: @test_load_cast_combine_nontemporal(
6464
; CHECK-NEXT: entry:
65-
; CHECK-NEXT: [[L1:%.*]] = load i32, ptr [[PTR:%.*]], align 4, !nontemporal !7
65+
; CHECK-NEXT: [[L1:%.*]] = load i32, ptr [[PTR:%.*]], align 4, !nontemporal [[META7:![0-9]+]]
6666
; CHECK-NEXT: ret i32 [[L1]]
6767
;
6868
entry:
@@ -76,7 +76,7 @@ define ptr @test_load_cast_combine_align(ptr %ptr) {
7676
; metadata.
7777
; CHECK-LABEL: @test_load_cast_combine_align(
7878
; CHECK-NEXT: entry:
79-
; CHECK-NEXT: [[L:%.*]] = load ptr, ptr [[PTR:%.*]], align 8, !align !8
79+
; CHECK-NEXT: [[L:%.*]] = load ptr, ptr [[PTR:%.*]], align 8, !align [[META8:![0-9]+]]
8080
; CHECK-NEXT: ret ptr [[L]]
8181
;
8282
entry:
@@ -89,7 +89,7 @@ define ptr @test_load_cast_combine_deref(ptr %ptr) {
8989
; metadata.
9090
; CHECK-LABEL: @test_load_cast_combine_deref(
9191
; CHECK-NEXT: entry:
92-
; CHECK-NEXT: [[L:%.*]] = load ptr, ptr [[PTR:%.*]], align 8, !dereferenceable !8
92+
; CHECK-NEXT: [[L:%.*]] = load ptr, ptr [[PTR:%.*]], align 8, !dereferenceable [[META8]]
9393
; CHECK-NEXT: ret ptr [[L]]
9494
;
9595
entry:
@@ -102,7 +102,7 @@ define ptr @test_load_cast_combine_deref_or_null(ptr %ptr) {
102102
; dereferenceable_or_null metadata.
103103
; CHECK-LABEL: @test_load_cast_combine_deref_or_null(
104104
; CHECK-NEXT: entry:
105-
; CHECK-NEXT: [[L:%.*]] = load ptr, ptr [[PTR:%.*]], align 8, !dereferenceable_or_null !8
105+
; CHECK-NEXT: [[L:%.*]] = load ptr, ptr [[PTR:%.*]], align 8, !dereferenceable_or_null [[META8]]
106106
; CHECK-NEXT: ret ptr [[L]]
107107
;
108108
entry:
@@ -151,7 +151,7 @@ exit:
151151
define void @test_load_cast_combine_nonnull(ptr %ptr) {
152152
; CHECK-LABEL: @test_load_cast_combine_nonnull(
153153
; CHECK-NEXT: entry:
154-
; CHECK-NEXT: [[P:%.*]] = load ptr, ptr [[PTR:%.*]], align 8, !nonnull !6
154+
; CHECK-NEXT: [[P:%.*]] = load ptr, ptr [[PTR:%.*]], align 8, !nonnull [[META6]]
155155
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[PTR]], i64 336
156156
; CHECK-NEXT: store ptr [[P]], ptr [[GEP]], align 8
157157
; CHECK-NEXT: ret void
@@ -165,7 +165,7 @@ entry:
165165

166166
define i32 @test_load_cast_combine_noundef(ptr %ptr) {
167167
; CHECK-LABEL: @test_load_cast_combine_noundef(
168-
; CHECK-NEXT: [[L1:%.*]] = load i32, ptr [[PTR:%.*]], align 4, !noundef !6
168+
; CHECK-NEXT: [[L1:%.*]] = load i32, ptr [[PTR:%.*]], align 4, !noundef [[META6]]
169169
; CHECK-NEXT: ret i32 [[L1]]
170170
;
171171
%l = load float, ptr %ptr, !noundef !{}
@@ -186,6 +186,81 @@ entry:
186186
ret i32 %c
187187
}
188188

189+
; FIXME: Should preserve metadata on loads.
190+
define double @preserve_load_metadata_after_select_transform(ptr %a, ptr %b) {
191+
; CHECK-LABEL: @preserve_load_metadata_after_select_transform(
192+
; CHECK-NEXT: entry:
193+
; CHECK-NEXT: [[L_A:%.*]] = load double, ptr [[A:%.*]], align 8
194+
; CHECK-NEXT: [[L_B:%.*]] = load double, ptr [[B:%.*]], align 8
195+
; CHECK-NEXT: [[CMP_I:%.*]] = fcmp fast olt double [[L_A]], [[L_B]]
196+
; CHECK-NEXT: [[L_SEL:%.*]] = select i1 [[CMP_I]], double [[L_B]], double [[L_A]]
197+
; CHECK-NEXT: ret double [[L_SEL]]
198+
;
199+
entry:
200+
%l.a = load double, ptr %a, align 8, !tbaa !0, !llvm.access.group !7
201+
%l.b = load double, ptr %b, align 8, !tbaa !0, !llvm.access.group !7
202+
%cmp.i = fcmp fast olt double %l.a, %l.b
203+
%ptr.sel = select i1 %cmp.i, ptr %b, ptr %a
204+
%l.sel = load double, ptr %ptr.sel, align 8, !tbaa !0, !llvm.access.group !7
205+
ret double %l.sel
206+
}
207+
208+
; FIXME: Should preserve metadata on loads.
209+
define double @preserve_load_metadata_after_select_transform_metadata_missing_1(ptr %a, ptr %b) {
210+
; CHECK-LABEL: @preserve_load_metadata_after_select_transform_metadata_missing_1(
211+
; CHECK-NEXT: entry:
212+
; CHECK-NEXT: [[L_A:%.*]] = load double, ptr [[A:%.*]], align 8
213+
; CHECK-NEXT: [[L_B:%.*]] = load double, ptr [[B:%.*]], align 8
214+
; CHECK-NEXT: [[CMP_I:%.*]] = fcmp fast olt double [[L_A]], [[L_B]]
215+
; CHECK-NEXT: [[L_SEL:%.*]] = select i1 [[CMP_I]], double [[L_B]], double [[L_A]]
216+
; CHECK-NEXT: ret double [[L_SEL]]
217+
;
218+
entry:
219+
%l.a = load double, ptr %a, align 8, !llvm.access.group !7
220+
%l.b = load double, ptr %b, align 8, !tbaa !0, !llvm.access.group !7
221+
%cmp.i = fcmp fast olt double %l.a, %l.b
222+
%ptr.sel = select i1 %cmp.i, ptr %b, ptr %a
223+
%l.sel = load double, ptr %ptr.sel, align 8, !tbaa !0, !llvm.access.group !7
224+
ret double %l.sel
225+
}
226+
227+
define double @preserve_load_metadata_after_select_transform_metadata_missing_2(ptr %a, ptr %b) {
228+
; CHECK-LABEL: @preserve_load_metadata_after_select_transform_metadata_missing_2(
229+
; CHECK-NEXT: entry:
230+
; CHECK-NEXT: [[L_A:%.*]] = load double, ptr [[A:%.*]], align 8
231+
; CHECK-NEXT: [[L_B:%.*]] = load double, ptr [[B:%.*]], align 8
232+
; CHECK-NEXT: [[CMP_I:%.*]] = fcmp fast olt double [[L_A]], [[L_B]]
233+
; CHECK-NEXT: [[L_SEL:%.*]] = select i1 [[CMP_I]], double [[L_B]], double [[L_A]]
234+
; CHECK-NEXT: ret double [[L_SEL]]
235+
;
236+
entry:
237+
%l.a = load double, ptr %a, align 8, !llvm.access.group !7
238+
%l.b = load double, ptr %b, align 8, !llvm.access.group !7
239+
%cmp.i = fcmp fast olt double %l.a, %l.b
240+
%ptr.sel = select i1 %cmp.i, ptr %b, ptr %a
241+
%l.sel = load double, ptr %ptr.sel, align 8, !tbaa !0, !llvm.access.group !12
242+
ret double %l.sel
243+
}
244+
245+
; FIXME: Should preserve metadata on loads.
246+
define double @preserve_load_metadata_after_select_transform_metadata_missing_3(ptr %a, ptr %b) {
247+
; CHECK-LABEL: @preserve_load_metadata_after_select_transform_metadata_missing_3(
248+
; CHECK-NEXT: entry:
249+
; CHECK-NEXT: [[L_A:%.*]] = load double, ptr [[A:%.*]], align 8
250+
; CHECK-NEXT: [[L_B:%.*]] = load double, ptr [[B:%.*]], align 8
251+
; CHECK-NEXT: [[CMP_I:%.*]] = fcmp fast olt double [[L_A]], [[L_B]]
252+
; CHECK-NEXT: [[L_SEL:%.*]] = select i1 [[CMP_I]], double [[L_B]], double [[L_A]]
253+
; CHECK-NEXT: ret double [[L_SEL]]
254+
;
255+
entry:
256+
%l.a = load double, ptr %a, align 8, !tbaa !0, !llvm.access.group !7
257+
%l.b = load double, ptr %b, align 8, !tbaa !0, !llvm.access.group !7
258+
%cmp.i = fcmp fast olt double %l.a, %l.b
259+
%ptr.sel = select i1 %cmp.i, ptr %b, ptr %a
260+
%l.sel = load double, ptr %ptr.sel, align 8, !tbaa !0, !llvm.access.group !12
261+
ret double %l.sel
262+
}
263+
189264
!0 = !{!1, !1, i64 0}
190265
!1 = !{!"scalar type", !2}
191266
!2 = !{!"root"}
@@ -198,3 +273,16 @@ entry:
198273
!9 = !{i64 8}
199274
!10 = distinct !{}
200275
!11 = !{i32 5, i32 6}
276+
!12 = !{}
277+
;.
278+
; CHECK: [[TBAA0]] = !{[[LOOP1]], [[LOOP1]], i64 0}
279+
; CHECK: [[LOOP1]] = !{!"scalar type", [[META2:![0-9]+]]}
280+
; CHECK: [[META2]] = !{!"root"}
281+
; CHECK: [[META3]] = !{[[META4:![0-9]+]]}
282+
; CHECK: [[META4]] = distinct !{[[META4]], [[META5:![0-9]+]]}
283+
; CHECK: [[META5]] = distinct !{[[META5]]}
284+
; CHECK: [[META6]] = !{}
285+
; CHECK: [[META7]] = !{i32 1}
286+
; CHECK: [[META8]] = !{i64 8}
287+
; CHECK: [[ACC_GRP9]] = distinct !{}
288+
;.

0 commit comments

Comments
 (0)