1
- // RUN: %target-swift-frontend %use_no_opaque_pointers -disable-type-layout %s -gnone -emit-ir -I %S/Inputs | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize -DINT=i%target-ptrsize
2
- // RUN: %target-swift-frontend -disable-type-layout %s -gnone -emit-ir -I %S/Inputs
1
+ // RUN: %target-swift-frontend -disable-type-layout %s -gnone -emit-ir -I %S/Inputs | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize -DINT=i%target-ptrsize
3
2
4
3
import Builtin
5
4
@@ -42,27 +41,24 @@ entry(%e : $Either<(), ()>):
42
41
43
42
// CHECK-NEXT: alloca
44
43
// CHECK-NEXT: trunc i8 {{.*}} to i1
45
- // CHECK-NEXT: bitcast
46
44
// CHECK-NEXT: llvm.lifetime.start
47
45
%s = alloc_stack $Either<(), ()>
48
46
49
47
%l = enum $Either<(), ()>, #Either.Left!enumelt, undef : $()
50
- // CHECK-NEXT: bitcast {{.*}} to i1*
51
48
// CHECK-NEXT: store i1 false
52
49
store %l to %s : $*Either<(), ()>
53
50
%r = enum $Either<(), ()>, #Either.Right!enumelt, undef : $()
54
- // CHECK-NEXT: bitcast {{.*}} to i1*
55
51
// CHECK-NEXT: store i1 true
56
52
store %r to %s : $*Either<(), ()>
57
53
58
54
%a = unchecked_enum_data %l : $Either<(), ()>, #Either.Left!enumelt
59
55
%b = unchecked_enum_data %r : $Either<(), ()>, #Either.Right!enumelt
60
56
61
- // CHECK-NEXT: br i1 {{%.*}}, label %7 , label %6
62
- // CHECK: 6 :
63
- // CHECK: br label %8
64
- // CHECK: 7 :
65
- // CHECK: br label %9
57
+ // CHECK-NEXT: br i1 {{%.*}}, label %[[RIGHT_PRE:[0-9]+]] , label %[[LEFT_PRE:[0-9]+]]
58
+ // CHECK: [[LEFT_PRE]] :
59
+ // CHECK: br label [[LEFT:%[0-9]+]]
60
+ // CHECK: [[RIGHT_PRE]] :
61
+ // CHECK: br label [[RIGHT:%[0-9]+]]
66
62
switch_enum %e : $Either<(), ()>,
67
63
case #Either.Left!enumelt: left,
68
64
case #Either.Right!enumelt: right
@@ -75,7 +71,7 @@ right(%y : $()):
75
71
%1 = integer_literal $Builtin.Int8, 1
76
72
br next(%1 : $Builtin.Int8)
77
73
78
- // CHECK: phi i8 [ 1, %9 ], [ 0, %8 ]
74
+ // CHECK: phi i8 [ 1, [[RIGHT]] ], [ 0, [[LEFT]] ]
79
75
next(%z : $Builtin.Int8):
80
76
dealloc_stack %s : $*Either<(), ()>
81
77
return undef : $()
@@ -91,23 +87,18 @@ entry(%e : $EitherOr<(), ()>):
91
87
fix_lifetime %e : $EitherOr<(), ()>
92
88
93
89
// CHECK-NEXT: alloca
94
- // CHECK-NEXT: bitcast
95
90
// CHECK-NEXT: llvm.lifetime.start
96
91
%s = alloc_stack $EitherOr<(), ()>
97
92
98
- // CHECK-NEXT: bitcast {{.*}} to i8*
99
93
// CHECK-NEXT: store i8 0
100
94
%l = enum $EitherOr<(), ()>, #EitherOr.Left!enumelt, undef : $()
101
95
store %l to %s : $*EitherOr<(), ()>
102
- // CHECK-NEXT: bitcast {{.*}} to i8*
103
96
// CHECK-NEXT: store i8 1
104
97
%r = enum $EitherOr<(), ()>, #EitherOr.Right!enumelt, undef : $()
105
98
store %r to %s : $*EitherOr<(), ()>
106
- // CHECK-NEXT: bitcast {{.*}} to i8*
107
99
// CHECK-NEXT: store i8 2
108
100
%m = enum $EitherOr<(), ()>, #EitherOr.Middle!enumelt
109
101
store %m to %s : $*EitherOr<(), ()>
110
- // CHECK-NEXT: bitcast {{.*}} to i8*
111
102
// CHECK-NEXT: store i8 3
112
103
%k = enum $EitherOr<(), ()>, #EitherOr.Center!enumelt
113
104
store %k to %s : $*EitherOr<(), ()>
@@ -265,36 +256,33 @@ entry:
265
256
}
266
257
267
258
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @dynamic_inject
268
- // CHECK: ([[EITHER_OR:%swift.opaque]]* noalias nocapture sret({{.*}}) %0, %swift.type* %T)
259
+ // CHECK: (ptr noalias nocapture sret({{.*}}) %0, ptr %T)
269
260
sil @dynamic_inject : $@convention(thin) <T> () -> @out EitherOr<T, Builtin.Int64> {
270
261
entry(%e : $*EitherOr<T, Builtin.Int64>):
271
- // CHECK: call void @swift_storeEnumTagMultiPayload(%swift.opaque* {{%.*}}, %swift.type* [[TYPE:%.*]], i32 0)
262
+ // CHECK: call void @swift_storeEnumTagMultiPayload(ptr {{%.*}}, ptr [[TYPE:%.*]], i32 0)
272
263
inject_enum_addr %e : $*EitherOr<T, Builtin.Int64>, #EitherOr.Left!enumelt
273
- // CHECK: call void @swift_storeEnumTagMultiPayload(%swift.opaque* {{%.*}}, %swift.type* [[TYPE]], i32 2)
264
+ // CHECK: call void @swift_storeEnumTagMultiPayload(ptr {{%.*}}, ptr [[TYPE]], i32 2)
274
265
inject_enum_addr %e : $*EitherOr<T, Builtin.Int64>, #EitherOr.Middle!enumelt
275
- // CHECK: call void @swift_storeEnumTagMultiPayload(%swift.opaque* {{%.*}}, %swift.type* [[TYPE]], i32 3)
266
+ // CHECK: call void @swift_storeEnumTagMultiPayload(ptr {{%.*}}, ptr [[TYPE]], i32 3)
276
267
inject_enum_addr %e : $*EitherOr<T, Builtin.Int64>, #EitherOr.Center!enumelt
277
- // CHECK: call void @swift_storeEnumTagMultiPayload(%swift.opaque* {{%.*}}, %swift.type* [[TYPE]], i32 1)
268
+ // CHECK: call void @swift_storeEnumTagMultiPayload(ptr {{%.*}}, ptr [[TYPE]], i32 1)
278
269
inject_enum_addr %e : $*EitherOr<T, Builtin.Int64>, #EitherOr.Right!enumelt
279
270
280
271
return undef : $()
281
272
}
282
273
283
274
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @dynamic_project
284
- // CHECK: ([[EITHER_OR]]* noalias nocapture sret({{.*}}) %0, %swift.type* %T)
275
+ // CHECK: (ptr noalias nocapture sret({{.*}}) %0, ptr %T)
285
276
sil @dynamic_project : $@convention(thin) <T> () -> @out EitherOr<T, Builtin.Int64> {
286
277
entry(%e : $*EitherOr<T, Builtin.Int64>):
287
- // CHECK: [[ARG:%.*]] = bitcast %swift.opaque* %0 to %T26enum_dynamic_multi_payload8EitherOrO.0
288
- // CHECK: bitcast %T26enum_dynamic_multi_payload8EitherOrO.0* [[ARG]] to %swift.opaque*
289
278
%l = unchecked_take_enum_data_addr %e : $*EitherOr<T, Builtin.Int64>, #EitherOr.Left!enumelt
290
- // CHECK: bitcast %T26enum_dynamic_multi_payload8EitherOrO.0* [[ARG]] to i64*
291
279
%r = unchecked_take_enum_data_addr %e : $*EitherOr<T, Builtin.Int64>, #EitherOr.Right!enumelt
292
280
293
281
return undef : $()
294
282
}
295
283
296
284
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @dynamic_switch
297
- // CHECK: ([[EITHER_OR]]* noalias nocapture sret({{.*}}) %0, %swift.type* %T)
285
+ // CHECK: (ptr noalias nocapture sret({{.*}}) %0, ptr %T)
298
286
sil @dynamic_switch : $@convention(thin) <T> () -> @out EitherOr<T, Builtin.Int64> {
299
287
entry(%e : $*EitherOr<T, Builtin.Int64>):
300
288
// CHECK: [[TAG:%.*]] = call i32 @swift_getEnumCaseMultiPayload
@@ -335,15 +323,17 @@ next(%x : $Builtin.Int8):
335
323
}
336
324
337
325
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @dynamic_value_semantics
338
- // CHECK: ([[EITHER_OR]]* noalias nocapture sret({{.*}}) %0, %T26enum_dynamic_multi_payload8EitherOrO.0* noalias nocapture %1, %swift.type* %T)
326
+ // CHECK: (ptr noalias nocapture sret({{.*}}) %0, ptr noalias nocapture %1, ptr %T)
339
327
sil @dynamic_value_semantics : $@convention(thin) <T> (@in EitherOr<T, Builtin.Int64>) -> @out EitherOr<T, Builtin.Int64> {
340
328
entry(%a : $*EitherOr<T, Builtin.Int64>, %b : $*EitherOr<T, Builtin.Int64>):
341
329
// CHECK: [[TAG:%.*]] = call i32 @swift_getEnumCaseMultiPayload
342
330
// -- only the Left branch of this instance needs cleanup
343
331
// CHECK: [[COND:%.*]] = icmp ne i32 [[TAG]], 0
344
332
// CHECK-NEXT: br i1 [[COND]], label %[[NOOP:[0-9]+]], label %[[LEFT:[0-9]+]]
345
333
// CHECK: [[LEFT]]:
346
- // CHECK: call void %destroy(%swift.opaque* noalias {{%.*}}, %swift.type* %T)
334
+ // CHECK: [[DESTROYADDR:%[0-9]+]] = getelementptr inbounds ptr, ptr %T.valueWitnesses, i32 1
335
+ // CHECK: [[DESTROY:%[0-9]+]] = load ptr, ptr [[DESTROYADDR]]
336
+ // CHECK: call void [[DESTROY]](ptr noalias {{%[0-9]+}}, ptr %T)
347
337
// CHECK: br label %[[NOOP]]
348
338
// CHECK: [[NOOP]]:
349
339
destroy_addr %a : $*EitherOr<T, Builtin.Int64>
@@ -353,7 +343,9 @@ entry(%a : $*EitherOr<T, Builtin.Int64>, %b : $*EitherOr<T, Builtin.Int64>):
353
343
// CHECK: [[COND:%.*]] = icmp ne i32 [[TAG]], 0
354
344
// CHECK-NEXT: br i1 [[COND]], label %[[TRIVIAL:[0-9]+]], label %[[LEFT:[0-9]+]]
355
345
// CHECK: [[LEFT]]:
356
- // CHECK: call %swift.opaque* %initializeWithTake(%swift.opaque* noalias {{%.*}}, %swift.type* %T)
346
+ // CHECK: [[INITWITHTAKEADDR:%[0-9]+]] = getelementptr inbounds ptr, ptr %T.valueWitnesses, i32 4
347
+ // CHECK: [[INITWITHTAKE:%[0-9]+]] = load ptr, ptr [[INITWITHTAKEADDR]]
348
+ // CHECK: {{%[0-9]+}} = call ptr [[INITWITHTAKE]](ptr noalias {{%[0-9]+}}, ptr noalias {{%[0-9]+}}, ptr %T)
357
349
// CHECK: br label %[[DONE:[0-9]+]]
358
350
// CHECK: [[TRIVIAL]]:
359
351
// CHECK: call void @llvm.memcpy
@@ -369,7 +361,7 @@ entry(%a : $*EitherOr<T, Builtin.Int64>, %b : $*EitherOr<T, Builtin.Int64>):
369
361
}
370
362
371
363
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @dynamic_value_semantics2
372
- // CHECK: (%swift.opaque* noalias nocapture sret({{.*}}) %0, %T26enum_dynamic_multi_payload8EitherOrO.1* noalias nocapture %1, %swift.type* %T)
364
+ // CHECK: (ptr noalias nocapture sret({{.*}}) %0, ptr noalias nocapture %1, ptr %T)
373
365
sil @dynamic_value_semantics2 : $@convention(thin) <T> (@in EitherOr<T, C>) -> @out EitherOr<T, C> {
374
366
entry(%a : $*EitherOr<T, C>, %b : $*EitherOr<T, C>):
375
367
// CHECK: [[TAG:%.*]] = call i32 @swift_getEnumCaseMultiPayload
@@ -378,10 +370,12 @@ entry(%a : $*EitherOr<T, C>, %b : $*EitherOr<T, C>):
378
370
// CHECK-NEXT: i32 1, label %[[RIGHT:[0-9]+]]
379
371
// CHECK-NEXT: ]
380
372
// CHECK: [[LEFT]]:
381
- // CHECK: call void %destroy(%swift.opaque* noalias {{%.*}}, %swift.type* %T)
373
+ // CHECK: [[DESTROYADDR:%[0-9]+]] = getelementptr inbounds ptr, ptr %T.valueWitnesses, i32 1
374
+ // CHECK: [[DESTROY:%[0-9]+]] = load ptr, ptr [[DESTROYADDR]]
375
+ // CHECK: call void [[DESTROY]](ptr noalias {{%[0-9]+}}, ptr %T)
382
376
// CHECK: br label %[[NOOP]]
383
377
// CHECK: [[RIGHT]]:
384
- // CHECK: call void {{.*}} @swift_release
378
+ // CHECK: call void @swift_release
385
379
// CHECK: [[NOOP]]:
386
380
destroy_addr %a : $*EitherOr<T, C>
387
381
@@ -390,7 +384,9 @@ entry(%a : $*EitherOr<T, C>, %b : $*EitherOr<T, C>):
390
384
// CHECK: [[COND:%.*]] = icmp ne i32 [[TAG]], 0
391
385
// CHECK-NEXT: br i1 [[COND]], label %[[TRIVIAL:[0-9]+]], label %[[LEFT:[0-9]+]]
392
386
// CHECK: [[LEFT]]:
393
- // CHECK: call %swift.opaque* %initializeWithTake(%swift.opaque* noalias {{%.*}}, %swift.type* %T)
387
+ // CHECK: [[INITWITHTAKEADDR:%[0-9]+]] = getelementptr inbounds ptr, ptr %T.valueWitnesses, i32 4
388
+ // CHECK: [[INITWITHTAKE:%[0-9]+]] = load ptr, ptr [[INITWITHTAKEADDR]]
389
+ // CHECK: {{%[0-9]+}} = call ptr [[INITWITHTAKE]](ptr noalias {{%[0-9]+}}, ptr noalias {{%[0-9]+}}, ptr %T)
394
390
// CHECK: br label %[[DONE:[0-9]+]]
395
391
// CHECK: [[TRIVIAL]]:
396
392
// CHECK: call void @llvm.memcpy
@@ -405,10 +401,12 @@ entry(%a : $*EitherOr<T, C>, %b : $*EitherOr<T, C>):
405
401
// CHECK-NEXT: i32 1, label %[[RIGHT:[0-9]+]]
406
402
// CHECK-NEXT: ]
407
403
// CHECK: [[LEFT]]:
408
- // CHECK: call %swift.opaque* %initializeWithCopy(%swift.opaque* noalias {{%.*}}, %swift.type* %T)
404
+ // CHECK: [[INITWITHCOPYADDR:%[0-9]+]] = getelementptr inbounds ptr, ptr %T.valueWitnesses, i32 2
405
+ // CHECK: [[INITWITHCOPY:%[0-9]+]] = load ptr, ptr [[INITWITHCOPYADDR]]
406
+ // CHECK: {{%[0-9]+}} = call ptr [[INITWITHCOPY]](ptr noalias {{%[0-9]+}}, ptr noalias {{%[0-9]+}}, ptr %T)
409
407
// CHECK: br label %[[DONE:[0-9]+]]
410
408
// CHECK: [[RIGHT]]:
411
- // CHECK: call %swift.refcounted* @swift_retain
409
+ // CHECK: call ptr @swift_retain
412
410
// CHECK: br label %[[DONE:[0-9]+]]
413
411
// CHECK: [[TRIVIAL]]:
414
412
// CHECK: call void @llvm.memcpy
@@ -419,35 +417,33 @@ entry(%a : $*EitherOr<T, C>, %b : $*EitherOr<T, C>):
419
417
return undef : $()
420
418
}
421
419
422
- // CHECK: define{{( dllexport)?}}{{( protected)?}} internal %swift.type* @"$s26enum_dynamic_multi_payload8EitherOrOMi"(%swift.type_descriptor* %0, i8** %1, i8* %2) {{.*}} {
423
- // CHECK: [[METADATA:%.*]] = call %swift.type* @swift_allocateGenericValueMetadata
420
+ // CHECK: define{{( dllexport)?}}{{( protected)?}} internal ptr @"$s26enum_dynamic_multi_payload8EitherOrOMi"(ptr %0, ptr %1, ptr %2) {{.*}} {
421
+ // CHECK: [[METADATA:%.*]] = call ptr @swift_allocateGenericValueMetadata
424
422
425
423
// CHECK: define{{( protected)?}} internal swiftcc %swift.metadata_response @"$s26enum_dynamic_multi_payload8EitherOrOMr"
426
- // CHECK-SAME: (%swift.type* [[METADATA:%.*]], i8* %0, i8** %1) {{.*}} {
424
+ // CHECK-SAME: (ptr [[METADATA:%.*]], ptr %0, ptr %1) {{.*}} {
427
425
428
- // CHECK: [[BUF:%.*]] = alloca [2 x i8** ]
426
+ // CHECK: [[BUF:%.*]] = alloca [2 x ptr ]
429
427
// CHECK: [[BUF0:%.*]] = getelementptr {{.*}} [[BUF]], i32 0, i32 0
430
- // CHECK: [[T0:%.*]] = call{{( tail)?}} swiftcc %swift.metadata_response @swift_checkMetadataState([[INT]] 319, %swift.type* %T)
428
+ // CHECK: [[T0:%.*]] = call{{( tail)?}} swiftcc %swift.metadata_response @swift_checkMetadataState([[INT]] 319, ptr %T)
431
429
// CHECK-NEXT: [[T_CHECKED:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
432
430
// CHECK-NEXT: [[T_STATUS:%.*]] = extractvalue %swift.metadata_response [[T0]], 1
433
431
// CHECK-NEXT: [[T_OK:%.*]] = icmp ule [[INT]] [[T_STATUS]], 63
434
432
// CHECK-NEXT: br i1 [[T_OK]],
435
- // CHECK: [[T0:%.*]] = bitcast %swift.type* [[T_CHECKED]] to i8***
436
- // CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i8**, i8*** [[T0]]
437
- // CHECK-NEXT: [[VALUE_WITNESSES:%.*]] = load i8**, i8*** [[T1]]
438
- // CHECK-NEXT: [[LAYOUT:%.*]] = getelementptr inbounds i8*, i8** [[VALUE_WITNESSES]], i32 8
439
- // CHECK-NEXT: store i8** [[LAYOUT]], {{.*}} [[BUF0]]
433
+ // CHECK: [[T1:%.*]] = getelementptr inbounds ptr, ptr [[T_CHECKED]]
434
+ // CHECK-NEXT: [[VALUE_WITNESSES:%.*]] = load ptr, ptr [[T1]]
435
+ // CHECK-NEXT: [[LAYOUT:%.*]] = getelementptr inbounds ptr, ptr [[VALUE_WITNESSES]], i32 8
436
+ // CHECK-NEXT: store ptr [[LAYOUT]], {{.*}} [[BUF0]]
440
437
441
438
// CHECK: [[BUF1:%.*]] = getelementptr {{.*}} [[BUF]], i32 0, i32 1
442
- // CHECK: [[T0:%.*]] = call{{( tail)?}} swiftcc %swift.metadata_response @swift_checkMetadataState([[INT]] 319, %swift.type* %U)
439
+ // CHECK: [[T0:%.*]] = call{{( tail)?}} swiftcc %swift.metadata_response @swift_checkMetadataState([[INT]] 319, ptr %U)
443
440
// CHECK-NEXT: [[U_CHECKED:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
444
441
// CHECK-NEXT: [[U_STATUS:%.*]] = extractvalue %swift.metadata_response [[T0]], 1
445
442
// CHECK-NEXT: [[U_OK:%.*]] = icmp ule [[INT]] [[U_STATUS]], 63
446
443
// CHECK-NEXT: br i1 [[U_OK]],
447
- // CHECK: [[T0:%.*]] = bitcast %swift.type* [[U_CHECKED]] to i8***
448
- // CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i8**, i8*** [[T0]]
449
- // CHECK-NEXT: [[VALUE_WITNESSES:%.*]] = load i8**, i8*** [[T1]]
450
- // CHECK-NEXT: [[LAYOUT:%.*]] = getelementptr inbounds i8*, i8** [[VALUE_WITNESSES]], i32 8
451
- // CHECK-NEXT: store i8** [[LAYOUT]], {{.*}} [[BUF1]]
444
+ // CHECK: [[T1:%.*]] = getelementptr inbounds ptr, ptr [[U_CHECKED]]
445
+ // CHECK-NEXT: [[VALUE_WITNESSES:%.*]] = load ptr, ptr [[T1]]
446
+ // CHECK-NEXT: [[LAYOUT:%.*]] = getelementptr inbounds ptr, ptr [[VALUE_WITNESSES]], i32 8
447
+ // CHECK-NEXT: store ptr [[LAYOUT]], {{.*}} [[BUF1]]
452
448
453
- // CHECK: call void @swift_initEnumMetadataMultiPayload(%swift.type* [[METADATA]], {{i(32|64)}} 0, {{i(32|64)}} 2, i8*** [[BUF0]])
449
+ // CHECK: call void @swift_initEnumMetadataMultiPayload(ptr [[METADATA]], {{i(32|64)}} 0, {{i(32|64)}} 2, ptr [[BUF0]])
0 commit comments