@@ -1429,12 +1429,66 @@ bb0(%x : $*T):
1429
1429
return %p : $@yield_once @callee_guaranteed @substituted <T where T: Copyable, T: Escapable> () -> (@out T, @yields @in T) for <T>
1430
1430
}
1431
1431
1432
- // FIXME: Cannot mangle free-standing archetypes
1433
- // sil @partial_apply_dynamic_with_out_param : $@convention(thin) <T> (Int32, @owned @yield_once @callee_guaranteed (Int32) -> (@out T, @yields @in T)) -> @yield_once @callee_guaranteed () -> (@out T, @yields @in T) {
1434
- // bb0(%x : $Int32, %f : $@yield_once @callee_guaranteed (Int32) -> (@out T, @yields @in T)):
1435
- // %p = partial_apply [callee_guaranteed] %f(%x) : $@yield_once @callee_guaranteed (Int32) -> (@out T, @yields @in T)
1436
- // return %p : $@yield_once @callee_guaranteed () -> (@out T, @yields @in T)
1437
- // }
1432
+ // CHECK: define {{.*}} { ptr, ptr } @partial_apply_dynamic_with_out_param
1433
+ // CHECK-SAME: (i32 %[[ARG1:.*]], ptr %[[ARG_FUNC:.*]], ptr %[[ARG_FUNC_SELF:.*]], ptr %[[TY:.*]])
1434
+ // CHECK: entry:
1435
+ // CHECK: %[[PA_CTX_BOX:.*]] = call noalias ptr @swift_allocObject(ptr getelementptr inbounds (%swift.full_boxmetadata
1436
+ // CHECK: %[[PA_ARG1:.*]] = getelementptr inbounds <{ %swift.refcounted, %Ts5Int32V, [4 x i8], ptr, ptr }>, ptr %[[PA_CTX_BOX]], i32 0, i32 1
1437
+ // CHECK: %[[PA_ARG1_INT:.*]] = getelementptr inbounds %Ts5Int32V, ptr %[[PA_ARG1]], i32 0, i32 0
1438
+ // CHECK: store i32 %[[ARG1]], ptr %[[PA_ARG1_INT]]
1439
+ // CHECK: %[[PA_ARG_FUNC_SELF:.*]] = getelementptr inbounds <{ %swift.refcounted, %Ts5Int32V, [4 x i8], ptr, ptr }>, ptr %[[PA_CTX_BOX]], i32 0, i32 3
1440
+ // CHECK: store ptr %[[ARG_FUNC_SELF]], ptr %[[PA_ARG_FUNC_SELF]]
1441
+ // CHECK: %[[PA_ARG_FUNC:.*]] = getelementptr inbounds <{ %swift.refcounted, %Ts5Int32V, [4 x i8], ptr, ptr }>, ptr %[[PA_CTX_BOX]], i32 0, i32 4
1442
+ // CHECK: store ptr %[[ARG_FUNC]], ptr %[[PA_ARG_FUNC]]
1443
+ // CHECK: %[[RET:.*]] = insertvalue { ptr, ptr } { ptr @"$sTA", ptr undef }, ptr %[[PA_CTX_BOX]], 1
1444
+ // CHECK: ret { ptr, ptr } %[[RET]]
1445
+ // CHECK: }
1446
+
1447
+ // CHECK: define {{.*}} { ptr, ptr } @"$sTA"
1448
+ // CHECK-SAME: (ptr noalias {{.*}} %[[CTX:.*]], ptr %[[INDIRECT_RET:.*]], ptr swiftself %[[PA_CTX_BOX:.*]])
1449
+ // CHECK: entry:
1450
+ // CHECK: %[[SPILL:.*]] = call ptr @malloc(i64 40)
1451
+ // CHECK: store ptr %[[SPILL]], ptr %[[CTX]]
1452
+ // CHECK: %[[FRAME:.*]] = getelementptr inbounds %"$sTA.Frame", ptr %[[SPILL]], i32 0, i32 0
1453
+ // CHECK: %[[PA_ARG1:.*]] = getelementptr inbounds <{ %swift.refcounted, %Ts5Int32V, [4 x i8], ptr, ptr }>, ptr %[[PA_CTX_BOX]], i32 0, i32 1
1454
+ // CHECK: %[[PA_ARG1_INT:.*]] = getelementptr inbounds %Ts5Int32V, ptr %[[PA_ARG1]], i32 0, i32 0
1455
+ // CHECK: %[[ARG1:.*]] = load i32, ptr %[[PA_ARG1_INT]]
1456
+ // CHECK: %[[PA_ARG_FUNC_SELF:.*]] = getelementptr inbounds <{ %swift.refcounted, %Ts5Int32V, [4 x i8], ptr, ptr }>, ptr %[[PA_CTX_BOX]], i32 0, i32 3
1457
+ // CHECK: %[[ARG_FUNC_SELF:.*]] = load ptr, ptr %[[PA_ARG_FUNC_SELF]]
1458
+ // CHECK: %[[PA_ARG_FUNC:.*]] = getelementptr inbounds <{ %swift.refcounted, %Ts5Int32V, [4 x i8], ptr, ptr }>, ptr %[[PA_CTX_BOX]], i32 0, i32 4
1459
+ // CHECK: %[[ARG_FUNC:.*]] = load ptr, ptr %[[PA_ARG_FUNC]]
1460
+ // CHECK: %[[FRAMEPTR:.*]] = getelementptr inbounds [32 x i8], ptr %[[FRAME]], i32 0, i32 0
1461
+ // CHECK: call void @llvm.lifetime.start.p0(i64 32, ptr %[[FRAMEPTR]])
1462
+ // CHECK: %[[YIELD_PAIR:.*]] = call swiftcc { ptr, ptr } %[[ARG_FUNC]](ptr noalias {{.*}} %[[FRAMEPTR]], ptr %[[INDIRECT_RET]], i32 %[[ARG1]], ptr swiftself %[[ARG_FUNC_SELF]])
1463
+ // CHECK: %[[RESUME:.*]] = extractvalue { ptr, ptr } %[[YIELD_PAIR]], 0
1464
+ // CHECK: %[[SPILL1:.*]] = getelementptr inbounds %"$sTA.Frame", ptr %[[SPILL]], i32 0, i32 1
1465
+ // CHECK: store ptr %[[RESUME]], ptr %[[SPILL1]]
1466
+ // CHECK: %[[YIELD:.*]] = extractvalue { ptr, ptr } %[[YIELD_PAIR]], 1
1467
+ // CHECK: %[[RET0:.*]] = insertvalue { ptr, ptr } poison, ptr @"$sTA.resume.0", 0
1468
+ // CHECK: %[[RET1:.*]] = insertvalue { ptr, ptr } %[[RET0]], ptr %[[YIELD]], 1
1469
+ // CHECK: ret { ptr, ptr } %[[RET1]]
1470
+ // CHECK: }
1471
+
1472
+ sil @partial_apply_dynamic_with_out_param : $@convention(thin) <T> (Int32, @owned @yield_once @callee_guaranteed (Int32) -> (@out T, @yields @in T)) -> @yield_once @callee_guaranteed () -> (@out T, @yields @in T) {
1473
+ bb0(%x : $Int32, %f : $@yield_once @callee_guaranteed (Int32) -> (@out T, @yields @in T)):
1474
+ %p = partial_apply [callee_guaranteed] %f(%x) : $@yield_once @callee_guaranteed (Int32) -> (@out T, @yields @in T)
1475
+ return %p : $@yield_once @callee_guaranteed () -> (@out T, @yields @in T)
1476
+ }
1477
+
1478
+ // Verify that the partial apply function is unique (even if it is not uniquely mangled)
1479
+ //
1480
+ // CHECK: define {{.*}} { ptr, ptr } @partial_apply_dynamic_with_out_param_another
1481
+ // CHECK: entry:
1482
+ // CHECK: %[[PA_CTX_BOX:.*]] = call noalias ptr @swift_allocObject(ptr getelementptr inbounds (%swift.full_boxmetadata
1483
+ // CHECK: %[[RET:.*]] = insertvalue { ptr, ptr } { ptr @"$sTA.{{.*}}", ptr undef }, ptr %[[PA_CTX_BOX]], 1
1484
+ // CHECK: ret { ptr, ptr } %[[RET]]
1485
+ // CHECK: }
1486
+
1487
+ sil @partial_apply_dynamic_with_out_param_another : $@convention(thin) <T> (Int64, @owned @yield_once @callee_guaranteed (Int64) -> (@out T, @yields @in T)) -> @yield_once @callee_guaranteed () -> (@out T, @yields @in T) {
1488
+ bb0(%x : $Int64, %f : $@yield_once @callee_guaranteed (Int64) -> (@out T, @yields @in T)):
1489
+ %p = partial_apply [callee_guaranteed] %f(%x) : $@yield_once @callee_guaranteed (Int64) -> (@out T, @yields @in T)
1490
+ return %p : $@yield_once @callee_guaranteed () -> (@out T, @yields @in T)
1491
+ }
1438
1492
1439
1493
class Base {
1440
1494
}
0 commit comments