@@ -1436,6 +1436,119 @@ func callImplAsync_g5(_ impl: ImplAsync, _ b: Bool) async -> (Int, Int, Int, Int
1436
1436
}
1437
1437
}
1438
1438
1439
+ // CHECK: define hidden swiftcc { float, float, i64 } @"$s16typed_throws_abi14nonMatching_f0ySf_SftSbAA7OneWordVYKF"(i1 %0, ptr swiftself %1, ptr noalias nocapture swifterror dereferenceable(8) %2)
1440
+ // CHECK: br i1 %0, label %[[SUCCESS:.*]], label %[[FAIL:.*]]
1441
+ // CHECK: [[SUCCESS]]:
1442
+ // CHECK: ret { float, float, i64 } { float 1.000000e+00, float 2.000000e+00, i64 undef }
1443
+ // CHECK: [[FAIL]]:
1444
+ // CHECK: [[ERROR_RES0:%.*]] = load i64, ptr %.x1._value, align 8
1445
+ // CHECK: store ptr inttoptr (i64 1 to ptr), ptr %2, align 8
1446
+ // CHECK: [[ERROR_RES:%.*]] = insertvalue { float, float, i64 } undef, i64 [[ERROR_RES0]], 2
1447
+ // CHECK: ret { float, float, i64 } [[ERROR_RES]]
1448
+ // CHECK: }
1449
+ func nonMatching_f0( _ b: Bool ) throws ( OneWord) -> ( Float , Float ) {
1450
+ guard b else {
1451
+ throw OneWord ( )
1452
+ }
1453
+ return ( 1.0 , 2.0 )
1454
+ }
1455
+
1456
+ // CHECK: define hidden swiftcc { i64, float, float } @"$s16typed_throws_abi18callNonMatching_f0ySi_S2ftSbF"(i1 %0)
1457
+ // CHECK: %swifterror = alloca swifterror ptr, align 8
1458
+ // CHECK: store ptr null, ptr %swifterror, align 8
1459
+ // CHECK: [[CALL_RES:%.*]] = call swiftcc { float, float, i64 } @"$s16typed_throws_abi14nonMatching_f0ySf_SftSbAA7OneWordVYKF"(i1 %0, ptr swiftself undef, ptr noalias nocapture swifterror dereferenceable(8) %swifterror)
1460
+ // CHECK: [[CALL_RES0:%.*]] = extractvalue { float, float, i64 } [[CALL_RES]], 0
1461
+ // CHECK: [[CALL_RES1:%.*]] = extractvalue { float, float, i64 } [[CALL_RES]], 1
1462
+ // CHECK: [[CALL_RES2:%.*]] = extractvalue { float, float, i64 } [[CALL_RES]], 2
1463
+ // CHECK: [[ERROR:%.*]] = load ptr, ptr %swifterror, align 8
1464
+ // CHECK: [[ISERROR:%.*]] = icmp ne ptr [[ERROR]], null
1465
+ // CHECK: br i1 [[ISERROR]], label %typed.error.load, label %[[SUCCESS:.*]]
1466
+ // CHECK: typed.error.load:
1467
+ // CHECK: br label %[[SET_ERROR:.*]]
1468
+ // CHECK: [[SUCCESS]]:
1469
+ // CHECK: [[SUCCESS_RES0:%.*]] = phi float [ [[CALL_RES0]], %entry ]
1470
+ // CHECK: [[SUCCESS_RES1:%.*]] = phi float [ [[CALL_RES1]], %entry ]
1471
+ // CHECK: br label %[[COMMON_RET:.*]]
1472
+ // CHECK: [[COMMON_RET]]:
1473
+ // CHECK: [[RETVAL0:%.*]] = phi i64 [ [[ERROR_RES0:%.*]], %[[SET_ERROR]] ], [ 1, %[[SUCCESS]] ]
1474
+ // CHECK: [[RETVAL1:%.*]] = phi float [ 0.000000e+00, %[[SET_ERROR]] ], [ [[SUCCESS_RES0]], %[[SUCCESS]] ]
1475
+ // CHECK: [[RETVAL2:%.*]] = phi float [ 0.000000e+00, %[[SET_ERROR]] ], [ [[SUCCESS_RES1]], %[[SUCCESS]] ]
1476
+ // CHECK: [[RETVAL3:%.*]] = insertvalue { i64, float, float } undef, i64 [[RETVAL0]], 0
1477
+ // CHECK: [[RETVAL4:%.*]] = insertvalue { i64, float, float } [[RETVAL3]], float [[RETVAL1]], 1
1478
+ // CHECK: [[RETVAL:%.*]] = insertvalue { i64, float, float } [[RETVAL4]], float [[RETVAL2]], 2
1479
+ // CHECK: ret { i64, float, float } [[RETVAL]]
1480
+ // CHECK: [[SET_ERROR]]:
1481
+ // CHECK: [[ERROR_RES0]] = phi i64 [ [[CALL_RES2]], %typed.error.load ]
1482
+ // CHECK: store ptr null, ptr %swifterror, align 8
1483
+ // CHECK: br label %[[COMMON_RET]]
1484
+ // CHECK: }
1485
+ func callNonMatching_f0( _ b: Bool ) -> ( Int , Float , Float ) {
1486
+ do {
1487
+ let res = try nonMatching_f0 ( b)
1488
+ return ( 1 , res. 0 , res. 1 )
1489
+ } catch {
1490
+ return ( error. x, 0.0 , 0.0 )
1491
+ }
1492
+ }
1493
+
1494
+ // define hidden swiftcc { float, i64, float } @"$s16typed_throws_abi14nonMatching_f1ySf_SbSftSbAA7OneWordVYKF"(i1 %0, ptr swiftself %1, ptr noalias nocapture swifterror dereferenceable(8) %2)
1495
+ // CHECK: br i1 %0, label %[[SUCCESS:.*]], label %[[FAIL:.*]]
1496
+ // CHECK: [[SUCCESS]]:
1497
+ // CHECK: ret { float, i64, float } { float 1.000000e+00, i64 1, float 2.000000e+00 }
1498
+ // CHECK: [[FAIL]]:
1499
+ // CHECK: [[ERROR_RES0:%.*]] = load i64, ptr %.x1._value, align 8
1500
+ // CHECK: store ptr inttoptr (i64 1 to ptr), ptr %2, align 8
1501
+ // CHECK: [[ERROR_RES:%.*]] = insertvalue { float, i64, float } undef, i64 [[ERROR_RES0]], 1
1502
+ // CHECK: ret { float, i64, float } [[ERROR_RES]]
1503
+ // }
1504
+ func nonMatching_f1( _ b: Bool ) throws ( OneWord) -> ( Float , Bool , Float ) {
1505
+ guard b else {
1506
+ throw OneWord ( )
1507
+ }
1508
+ return ( 1.0 , true , 2.0 )
1509
+ }
1510
+
1511
+ // CHECK: define hidden swiftcc { i64, float, i1, float } @"$s16typed_throws_abi18callNonMatching_f1ySi_SfSbSftSbF"(i1 %0)
1512
+ // CHECK: %swifterror = alloca swifterror ptr, align 8
1513
+ // CHECK: [[CALL_RES:%.*]] = call swiftcc { float, i64, float } @"$s16typed_throws_abi14nonMatching_f1ySf_SbSftSbAA7OneWordVYKF"(i1 %0, ptr swiftself undef, ptr noalias nocapture swifterror dereferenceable(8) %swifterror)
1514
+ // CHECK: [[CALL_RES0:%.*]] = extractvalue { float, i64, float } [[CALL_RES]], 0
1515
+ // CHECK: [[CALL_RES1:%.*]] = extractvalue { float, i64, float } [[CALL_RES]], 1
1516
+ // CHECK: [[CALL_RES2:%.*]] = extractvalue { float, i64, float } [[CALL_RES]], 2
1517
+ // CHECK: [[CALL_RES1_TRUNC:%.*]] = trunc i64 [[CALL_RES1]] to i1
1518
+ // CHECK: [[ERROR:%.*]] = load ptr, ptr %swifterror, align 8
1519
+ // CHECK: [[ISERROR:%.*]] = icmp ne ptr [[ERROR]], null
1520
+ // CHECK: br i1 [[ISERROR]], label %typed.error.load, label %[[SUCCESS:.*]]
1521
+ // CHECK: typed.error.load:
1522
+ // CHECK: br label %[[SET_ERROR:.*]]
1523
+ // CHECK: [[SUCCESS]]:
1524
+ // CHECK: [[SUCCESS_RES0:%.*]] = phi float [ [[CALL_RES0]], %entry ]
1525
+ // CHECK: [[SUCCESS_RES1:%.*]] = phi i1 [ [[CALL_RES1_TRUNC]], %entry ]
1526
+ // CHECK: [[SUCCESS_RES2:%.*]] = phi float [ [[CALL_RES2]], %entry ]
1527
+ // CHECK: br label %[[COMMON_RET:.*]]
1528
+ // CHECK: [[COMMON_RET]]:
1529
+ // CHECK: [[RETVAL0:%.*]] = phi i64 [ [[ERROR_RES0:%.*]], %[[SET_ERROR]] ], [ 1, %[[SUCCESS]] ]
1530
+ // CHECK: [[RETVAL1:%.*]] = phi float [ 0.000000e+00, %[[SET_ERROR]] ], [ [[SUCCESS_RES0]], %[[SUCCESS]] ]
1531
+ // CHECK: [[RETVAL2:%.*]] = phi i1 [ false, %[[SET_ERROR]] ], [ [[SUCCESS_RES1]], %[[SUCCESS]] ]
1532
+ // CHECK: [[RETVAL3:%.*]] = phi float [ 0.000000e+00, %[[SET_ERROR]] ], [ [[SUCCESS_RES2]], %[[SUCCESS]] ]
1533
+ // CHECK: [[RETVAL4:%.*]] = insertvalue { i64, float, i1, float } undef, i64 [[RETVAL0]], 0
1534
+ // CHECK: [[RETVAL5:%.*]] = insertvalue { i64, float, i1, float } [[RETVAL4]], float [[RETVAL1]], 1
1535
+ // CHECK: [[RETVAL6:%.*]] = insertvalue { i64, float, i1, float } [[RETVAL5]], i1 [[RETVAL2]], 2
1536
+ // CHECK: [[RETVAL:%.*]] = insertvalue { i64, float, i1, float } [[RETVAL6]], float [[RETVAL3]], 3
1537
+ // CHECK: ret { i64, float, i1, float } [[RETVAL]]
1538
+ // CHECK: [[SET_ERROR]]:
1539
+ // CHECK: [[ERROR_RES0]] = phi i64 [ [[CALL_RES1]], %typed.error.load ]
1540
+ // CHECK: store ptr null, ptr %swifterror, align 8
1541
+ // CHECK: br label %[[COMMON_RET]]
1542
+ // CHECK: }
1543
+ func callNonMatching_f1( _ b: Bool ) -> ( Int , Float , Bool , Float ) {
1544
+ do {
1545
+ let res = try nonMatching_f1 ( b)
1546
+ return ( 1 , res. 0 , res. 1 , res. 2 )
1547
+ } catch {
1548
+ return ( error. x, 0.0 , false , 0.0 )
1549
+ }
1550
+ }
1551
+
1439
1552
protocol P {
1440
1553
// CHECK: define hidden swiftcc void @"$s16typed_throws_abi1PP2f0yySbAA5EmptyVYKFTj"(i1 %0, ptr noalias swiftself %1, ptr noalias nocapture swifterror dereferenceable(8) %2, ptr %3, ptr %4)
1441
1554
// CHECK: [[ERROR:%.*]] = load ptr, ptr %2
0 commit comments