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
2
2
; RUN: opt -passes=instcombine -S < %s | FileCheck %s
3
3
4
4
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) {
20
20
; Ensure (cast (load (...))) -> (load (cast (...))) preserves no-alias metadata.
21
21
; CHECK-LABEL: @test_load_cast_combine_noalias(
22
22
; 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]]
24
24
; CHECK-NEXT: ret i32 [[L1]]
25
25
;
26
26
entry:
@@ -48,7 +48,7 @@ define i32 @test_load_cast_combine_invariant(ptr %ptr) {
48
48
; Ensure (cast (load (...))) -> (load (cast (...))) preserves invariant metadata.
49
49
; CHECK-LABEL: @test_load_cast_combine_invariant(
50
50
; 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]+]]
52
52
; CHECK-NEXT: ret i32 [[L1]]
53
53
;
54
54
entry:
@@ -62,7 +62,7 @@ define i32 @test_load_cast_combine_nontemporal(ptr %ptr) {
62
62
; metadata.
63
63
; CHECK-LABEL: @test_load_cast_combine_nontemporal(
64
64
; 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]+]]
66
66
; CHECK-NEXT: ret i32 [[L1]]
67
67
;
68
68
entry:
@@ -76,7 +76,7 @@ define ptr @test_load_cast_combine_align(ptr %ptr) {
76
76
; metadata.
77
77
; CHECK-LABEL: @test_load_cast_combine_align(
78
78
; 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]+]]
80
80
; CHECK-NEXT: ret ptr [[L]]
81
81
;
82
82
entry:
@@ -89,7 +89,7 @@ define ptr @test_load_cast_combine_deref(ptr %ptr) {
89
89
; metadata.
90
90
; CHECK-LABEL: @test_load_cast_combine_deref(
91
91
; 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]]
93
93
; CHECK-NEXT: ret ptr [[L]]
94
94
;
95
95
entry:
@@ -102,7 +102,7 @@ define ptr @test_load_cast_combine_deref_or_null(ptr %ptr) {
102
102
; dereferenceable_or_null metadata.
103
103
; CHECK-LABEL: @test_load_cast_combine_deref_or_null(
104
104
; 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]]
106
106
; CHECK-NEXT: ret ptr [[L]]
107
107
;
108
108
entry:
@@ -151,7 +151,7 @@ exit:
151
151
define void @test_load_cast_combine_nonnull (ptr %ptr ) {
152
152
; CHECK-LABEL: @test_load_cast_combine_nonnull(
153
153
; 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]]
155
155
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[PTR]], i64 336
156
156
; CHECK-NEXT: store ptr [[P]], ptr [[GEP]], align 8
157
157
; CHECK-NEXT: ret void
@@ -165,7 +165,7 @@ entry:
165
165
166
166
define i32 @test_load_cast_combine_noundef (ptr %ptr ) {
167
167
; 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]]
169
169
; CHECK-NEXT: ret i32 [[L1]]
170
170
;
171
171
%l = load float , ptr %ptr , !noundef !{}
@@ -186,6 +186,81 @@ entry:
186
186
ret i32 %c
187
187
}
188
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
+
189
264
!0 = !{!1 , !1 , i64 0 }
190
265
!1 = !{!"scalar type" , !2 }
191
266
!2 = !{!"root" }
@@ -198,3 +273,16 @@ entry:
198
273
!9 = !{i64 8 }
199
274
!10 = distinct !{}
200
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