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
44target 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;
2626entry:
@@ -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;
5454entry:
@@ -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;
6868entry:
@@ -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;
8282entry:
@@ -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;
9595entry:
@@ -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;
108108entry:
@@ -151,7 +151,7 @@ exit:
151151define 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,14 +165,102 @@ entry:
165165
166166define 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 !{}
172172 %c = bitcast float %l to i32
173173 ret i32 %c
174174}
175175
176+ define i32 @test_load_cast_combine_noalias_addrspace (ptr %ptr ) {
177+ ; Ensure (cast (load (...))) -> (load (cast (...))) preserves TBAA.
178+ ; CHECK-LABEL: @test_load_cast_combine_noalias_addrspace(
179+ ; CHECK-NEXT: entry:
180+ ; CHECK-NEXT: [[L1:%.*]] = load i32, ptr [[PTR:%.*]], align 4
181+ ; CHECK-NEXT: ret i32 [[L1]]
182+ ;
183+ entry:
184+ %l = load float , ptr %ptr , align 4 , !noalias.addrspace !11
185+ %c = bitcast float %l to i32
186+ ret i32 %c
187+ }
188+
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+
176264!0 = !{!1 , !1 , i64 0 }
177265!1 = !{!"scalar type" , !2 }
178266!2 = !{!"root" }
@@ -184,3 +272,17 @@ define i32 @test_load_cast_combine_noundef(ptr %ptr) {
184272!8 = !{i32 1 }
185273!9 = !{i64 8 }
186274!10 = distinct !{}
275+ !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