Skip to content

Commit 03c3d98

Browse files
committed
[IRGen] Assign error flag after calling direct error returning async typed throws function
1 parent 0b5f193 commit 03c3d98

File tree

2 files changed

+259
-5
lines changed

2 files changed

+259
-5
lines changed

lib/IRGen/GenCall.cpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3232,19 +3232,27 @@ class AsyncCallEmission final : public CallEmission {
32323232
bool mayReturnErrorDirectly = mayReturnTypedErrorDirectly();
32333233
if (mayReturnErrorDirectly && !nativeSchema.requiresIndirect()) {
32343234
llvm::Value *resultAgg;
3235-
if (resultTys.size() == 1) {
3235+
3236+
auto directResultTys = resultTys.drop_back();
3237+
if (directResultTys.size() == 1) {
32363238
resultAgg = Builder.CreateExtractValue(result, numAsyncContextParams);
32373239
} else {
3238-
auto resultTy = llvm::StructType::get(IGM.getLLVMContext(), resultTys);
3240+
auto resultTy =
3241+
llvm::StructType::get(IGM.getLLVMContext(), directResultTys);
32393242
resultAgg = llvm::UndefValue::get(resultTy);
3240-
for (unsigned i = 0, e = resultTys.size(); i != e; ++i) {
3243+
for (unsigned i = 0, e = directResultTys.size(); i != e; ++i) {
32413244
llvm::Value *elt =
32423245
Builder.CreateExtractValue(result, numAsyncContextParams + i);
32433246
resultAgg = Builder.CreateInsertValue(resultAgg, elt, i);
32443247
}
32453248
}
3246-
return emitToUnmappedExplosionWithDirectTypedError(resultType, resultAgg,
3247-
out);
3249+
emitToUnmappedExplosionWithDirectTypedError(resultType, resultAgg, out);
3250+
auto errorResult = Builder.CreateExtractValue(
3251+
result, numAsyncContextParams + directResultTys.size());
3252+
Address errorAddr =
3253+
IGF.getCalleeErrorResultSlot(errorType, substConv.isTypedError());
3254+
Builder.CreateStore(errorResult, errorAddr);
3255+
return;
32483256
} else if (resultTys.size() == 1) {
32493257
result = Builder.CreateExtractValue(result, numAsyncContextParams);
32503258
if (hasError) {

test/IRGen/typed_throws_abi.swift

Lines changed: 246 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -932,6 +932,252 @@ struct ImplAsync: PAsync {
932932
}
933933
}
934934

935+
// CHECK: define hidden swifttailcc void @"$s16typed_throws_abi16callImplAsync_f0ySbAA0eF0V_SbtYaF"(ptr swiftasync %0, i1 %1)
936+
// CHECK: %swifterror = alloca swifterror ptr, align 8
937+
// CHECK: [[CALL:%.*]] = call token @llvm.coro.id.async(i32 16, i32 16, i32 0, ptr @"$s16typed_throws_abi16callImplAsync_f0ySbAA0eF0V_SbtYaFTu")
938+
// CHECK: [[CORO:%.*]] = call ptr @llvm.coro.begin(token [[CALL]], ptr null)
939+
// CHECK: store ptr null, ptr %swifterror, align 8
940+
// CHECK: [[CORO_RESUME:%.*]] = call ptr @llvm.coro.async.resume()
941+
// CHECK: [[CALL_RES:%.*]] = call { ptr, ptr } (i32, ptr, ptr, ...) @llvm.coro.suspend.async.sl_p0p0s(i32 {{[0-9]+}}, ptr [[CORO_RESUME]], ptr @__swift_async_resume_project_context, ptr @"{{.*}}", ptr @"{{.*}}", ptr {{%.*}}, i1 %1)
942+
// CHECK: [[ERROR_FLAG:%.*]] = extractvalue { ptr, ptr } [[CALL_RES]], 1
943+
// CHECK: store ptr [[ERROR_FLAG]], ptr %swifterror, align 8
944+
// CHECK: [[ERROR:%.*]] = load ptr, ptr %swifterror, align 8
945+
// CHECK: [[ISERROR:%.*]] = icmp ne ptr [[ERROR]], null
946+
// CHECK: br i1 [[ISERROR]], label %typed.error.load, label %[[SUCCESS:.*]]
947+
// CHECK: typed.error.load:
948+
// CHECK: br label %[[SET_ERROR:.*]]
949+
// CHECK: [[SUCCESS]]:
950+
// CHECK: br label %[[COMMON_RET:.*]]
951+
// CHECK: [[COMMON_RET]]:
952+
// CHECK: [[RETVAL:%.*]] = phi i1 [ false, %[[SET_ERROR]] ], [ true, %[[SUCCESS]] ]
953+
// CHECK: call i1 (ptr, i1, ...) @llvm.coro.end.async(ptr [[CORO]], i1 false, ptr @"{{.*}}", ptr {{%.*}}, ptr {{%.*}}, i1 [[RETVAL]])
954+
// CHECK: unreachable
955+
// CHECK: [[SET_ERROR]]:
956+
// CHECK: store ptr null, ptr %swifterror, align 8
957+
// CHECK: br label %[[COMMON_RET]]
958+
// CHECK: }
959+
@available(SwiftStdlib 6.0, *)
960+
func callImplAsync_f0(_ impl: ImplAsync, _ b: Bool) async -> Bool {
961+
do {
962+
try await impl.f0(b)
963+
return true
964+
} catch {
965+
return false
966+
}
967+
}
968+
969+
// CHECK: define hidden swifttailcc void @"$s16typed_throws_abi16callImplAsync_f1ySiAA0eF0V_SbtYaF"(ptr swiftasync %0, i1 %1)
970+
// CHECK: %swifterror = alloca swifterror ptr, align 8
971+
// CHECK: [[CALL:%.*]] = call token @llvm.coro.id.async(i32 16, i32 16, i32 0, ptr @"$s16typed_throws_abi16callImplAsync_f1ySiAA0eF0V_SbtYaFTu")
972+
// CHECK: [[CORO:%.*]] = call ptr @llvm.coro.begin(token [[CALL]], ptr null)
973+
// CHECK: store ptr null, ptr %swifterror, align 8
974+
// CHECK: [[CORO_RESUME:%.*]] = call ptr @llvm.coro.async.resume()
975+
// CHECK: [[CALL_RES:%.*]] = call { ptr, i64, ptr } (i32, ptr, ptr, ...) @llvm.coro.suspend.async.sl_p0i64p0s(i32 {{[0-9]+}}, ptr [[CORO_RESUME]], ptr @__swift_async_resume_project_context, ptr @"{{.*}}", ptr @"{{.*}}", ptr {{%.*}}, i1 %1)
976+
// CHECK: [[CALL_RES0:%.*]] = extractvalue { ptr, i64, ptr } [[CALL_RES]], 1
977+
// CHECK: [[ERROR_FLAG:%.*]] = extractvalue { ptr, i64, ptr } [[CALL_RES]], 2
978+
// CHECK: store ptr [[ERROR_FLAG]], ptr %swifterror, align 8
979+
// CHECK: [[ERROR:%.*]] = load ptr, ptr %swifterror, align 8
980+
// CHECK: [[ISERROR:%.*]] = icmp ne ptr [[ERROR]], null
981+
// CHECK: br i1 [[ISERROR]], label %typed.error.load, label %[[SUCCESS:.*]]
982+
// CHECK: typed.error.load:
983+
// CHECK: br label %[[SET_ERROR:.*]]
984+
// CHECK: [[SUCCESS]]:
985+
// CHECK: [[SUCCESS_RES0:%.*]] = phi i64 [ [[CALL_RES0]], %entry ]
986+
// CHECK: br label %[[COMMON_RET:.*]]
987+
// CHECK: [[COMMON_RET]]:
988+
// CHECK: [[RETVAL:%.*]] = phi i64 [ 0, %[[SET_ERROR]] ], [ [[SUCCESS_RES0]], %[[SUCCESS]] ]
989+
// CHECK: call i1 (ptr, i1, ...) @llvm.coro.end.async(ptr [[CORO]], i1 false, ptr @"{{.*}}", ptr {{%.*}}, ptr {{%.*}}, i64 [[RETVAL]])
990+
// CHECK: unreachable
991+
// CHECK: [[SET_ERROR]]:
992+
// CHECK: store ptr null, ptr %swifterror, align 8
993+
// CHECK: br label %[[COMMON_RET]]
994+
// CHECK: }
995+
@available(SwiftStdlib 6.0, *)
996+
func callImplAsync_f1(_ impl: ImplAsync, _ b: Bool) async -> Int {
997+
do {
998+
return try await impl.f1(b)
999+
} catch {
1000+
return 0
1001+
}
1002+
}
1003+
1004+
// CHECK: define hidden swifttailcc void @"$s16typed_throws_abi16callImplAsync_f2ySi_SitAA0eF0V_SbtYaF"(ptr swiftasync %0, i1 %1)
1005+
// CHECK: %swifterror = alloca swifterror ptr, align 8
1006+
// CHECK: [[CALL:%.*]] = call token @llvm.coro.id.async(i32 16, i32 16, i32 0, ptr @"$s16typed_throws_abi16callImplAsync_f2ySi_SitAA0eF0V_SbtYaFTu")
1007+
// CHECK: [[CORO:%.*]] = call ptr @llvm.coro.begin(token [[CALL]], ptr null)
1008+
// CHECK: store ptr null, ptr %swifterror, align 8
1009+
// CHECK: [[CORO_RESUME:%.*]] = call ptr @llvm.coro.async.resume()
1010+
// CHECK: [[CALL_RES:%.*]] = call { ptr, i64, i64, ptr } (i32, ptr, ptr, ...) @llvm.coro.suspend.async.sl_p0i64i64p0s(i32 {{[0-9]+}}, ptr [[CORO_RESUME]], ptr @__swift_async_resume_project_context, ptr @"{{.*}}", ptr @"{{.*}}", ptr {{%.*}}, i1 %1)
1011+
// CHECK: [[CALL_RES0:%.*]] = extractvalue { i64, i64 } {{%.*}}, 0
1012+
// CHECK: [[CALL_RES1:%.*]] = extractvalue { i64, i64 } {{%.*}}, 1
1013+
// CHECK: [[ERROR_FLAG:%.*]] = extractvalue { ptr, i64, i64, ptr } [[CALL_RES]], 3
1014+
// CHECK: store ptr [[ERROR_FLAG]], ptr %swifterror, align 8
1015+
// CHECK: [[ERROR:%.*]] = load ptr, ptr %swifterror, align 8
1016+
// CHECK: [[ISERROR:%.*]] = icmp ne ptr [[ERROR]], null
1017+
// CHECK: br i1 [[ISERROR]], label %typed.error.load, label %[[SUCCESS:.*]]
1018+
// CHECK: typed.error.load:
1019+
// CHECK: br label %[[SET_ERROR:.*]]
1020+
// CHECK: [[SUCCESS]]:
1021+
// CHECK: [[SUCCESS_RES0:%.*]] = phi i64 [ [[CALL_RES0]], %entry ]
1022+
// CHECK: [[SUCCESS_RES1:%.*]] = phi i64 [ [[CALL_RES1]], %entry ]
1023+
// CHECK: br label %[[COMMON_RET:.*]]
1024+
// CHECK: [[COMMON_RET]]:
1025+
// CHECK: [[RETVAL0:%.*]] = phi i64 [ 0, %[[SET_ERROR]] ], [ [[SUCCESS_RES0]], %[[SUCCESS]] ]
1026+
// CHECK: [[RETVAL1:%.*]] = phi i64 [ 0, %[[SET_ERROR]] ], [ [[SUCCESS_RES1]], %[[SUCCESS]] ]
1027+
// CHECK: call i1 (ptr, i1, ...) @llvm.coro.end.async(ptr [[CORO]], i1 false, ptr @"{{.*}}", ptr {{%.*}}, ptr {{%.*}}, i64 [[RETVAL0]], i64 [[RETVAL1]])
1028+
// CHECK: unreachable
1029+
// CHECK: [[SET_ERROR]]:
1030+
// CHECK: store ptr null, ptr %swifterror, align 8
1031+
// CHECK: br label %[[COMMON_RET]]
1032+
// CHECK: }
1033+
@available(SwiftStdlib 6.0, *)
1034+
func callImplAsync_f2(_ impl: ImplAsync, _ b: Bool) async -> (Int, Int) {
1035+
do {
1036+
return try await impl.f2(b)
1037+
} catch {
1038+
return (0, 0)
1039+
}
1040+
}
1041+
1042+
// CHECK: define hidden swifttailcc void @"$s16typed_throws_abi16callImplAsync_f3ySi_S2itAA0eF0V_SbtYaF"(ptr swiftasync %0, i1 %1)
1043+
// CHECK: %swifterror = alloca swifterror ptr, align 8
1044+
// CHECK: [[CALL:%.*]] = call token @llvm.coro.id.async(i32 16, i32 16, i32 0, ptr @"$s16typed_throws_abi16callImplAsync_f3ySi_S2itAA0eF0V_SbtYaFTu")
1045+
// CHECK: [[CORO:%.*]] = call ptr @llvm.coro.begin(token [[CALL]], ptr null)
1046+
// CHECK: store ptr null, ptr %swifterror, align 8
1047+
// CHECK: [[CORO_RESUME:%.*]] = call ptr @llvm.coro.async.resume()
1048+
// CHECK: [[CALL_RES:%.*]] = call { ptr, i64, i64, i64, ptr } (i32, ptr, ptr, ...) @llvm.coro.suspend.async.sl_p0i64i64i64p0s(i32 {{[0-9]+}}, ptr [[CORO_RESUME]], ptr @__swift_async_resume_project_context, ptr @"{{.*}}", ptr @"{{.*}}", ptr {{%.*}}, i1 %1)
1049+
// CHECK: [[CALL_RES0:%.*]] = extractvalue { i64, i64, i64 } {{%.*}}, 0
1050+
// CHECK: [[CALL_RES1:%.*]] = extractvalue { i64, i64, i64 } {{%.*}}, 1
1051+
// CHECK: [[CALL_RES2:%.*]] = extractvalue { i64, i64, i64 } {{%.*}}, 2
1052+
// CHECK: [[ERROR_FLAG:%.*]] = extractvalue { ptr, i64, i64, i64, ptr } [[CALL_RES]], 4
1053+
// CHECK: store ptr [[ERROR_FLAG]], ptr %swifterror, align 8
1054+
// CHECK: [[ERROR:%.*]] = load ptr, ptr %swifterror, align 8
1055+
// CHECK: [[ISERROR:%.*]] = icmp ne ptr [[ERROR]], null
1056+
// CHECK: br i1 [[ISERROR]], label %typed.error.load, label %[[SUCCESS:.*]]
1057+
// CHECK: typed.error.load:
1058+
// CHECK: br label %[[SET_ERROR:.*]]
1059+
// CHECK: [[SUCCESS]]:
1060+
// CHECK: [[SUCCESS_RES0:%.*]] = phi i64 [ [[CALL_RES0]], %entry ]
1061+
// CHECK: [[SUCCESS_RES1:%.*]] = phi i64 [ [[CALL_RES1]], %entry ]
1062+
// CHECK: [[SUCCESS_RES2:%.*]] = phi i64 [ [[CALL_RES2]], %entry ]
1063+
// CHECK: br label %[[COMMON_RET:.*]]
1064+
// CHECK: [[COMMON_RET]]:
1065+
// CHECK: [[RETVAL0:%.*]] = phi i64 [ 0, %[[SET_ERROR]] ], [ [[SUCCESS_RES0]], %[[SUCCESS]] ]
1066+
// CHECK: [[RETVAL1:%.*]] = phi i64 [ 0, %[[SET_ERROR]] ], [ [[SUCCESS_RES1]], %[[SUCCESS]] ]
1067+
// CHECK: [[RETVAL2:%.*]] = phi i64 [ 0, %[[SET_ERROR]] ], [ [[SUCCESS_RES2]], %[[SUCCESS]] ]
1068+
// CHECK: call i1 (ptr, i1, ...) @llvm.coro.end.async(ptr [[CORO]], i1 false, ptr @"{{.*}}", ptr {{%.*}}, ptr {{%.*}}, i64 [[RETVAL0]], i64 [[RETVAL1]], i64 [[RETVAL2]])
1069+
// CHECK: unreachable
1070+
// CHECK: [[SET_ERROR]]:
1071+
// CHECK: store ptr null, ptr %swifterror, align 8
1072+
// CHECK: br label %[[COMMON_RET]]
1073+
// CHECK: }
1074+
@available(SwiftStdlib 6.0, *)
1075+
func callImplAsync_f3(_ impl: ImplAsync, _ b: Bool) async -> (Int, Int, Int) {
1076+
do {
1077+
return try await impl.f3(b)
1078+
} catch {
1079+
return (0, 0, 0)
1080+
}
1081+
}
1082+
1083+
// CHECK: define hidden swifttailcc void @"$s16typed_throws_abi16callImplAsync_f4ySi_S3itAA0eF0V_SbtYaF"(ptr swiftasync %0, i1 %1)
1084+
// CHECK: %swifterror = alloca swifterror ptr, align 8
1085+
// CHECK: [[CALL:%.*]] = call token @llvm.coro.id.async(i32 16, i32 16, i32 0, ptr @"$s16typed_throws_abi16callImplAsync_f4ySi_S3itAA0eF0V_SbtYaFTu")
1086+
// CHECK: [[CORO:%.*]] = call ptr @llvm.coro.begin(token [[CALL]], ptr null)
1087+
// CHECK: store ptr null, ptr %swifterror, align 8
1088+
// CHECK: [[CORO_RESUME:%.*]] = call ptr @llvm.coro.async.resume()
1089+
// CHECK: [[CALL_RES:%.*]] = call { ptr, i64, i64, i64, i64, ptr } (i32, ptr, ptr, ...) @llvm.coro.suspend.async.sl_p0i64i64i64i64p0s(i32 {{[0-9]+}}, ptr [[CORO_RESUME]], ptr @__swift_async_resume_project_context, ptr @"{{.*}}", ptr @"{{.*}}", ptr {{%.*}}, i1 %1)
1090+
// CHECK: [[CALL_RES0:%.*]] = extractvalue { i64, i64, i64, i64 } {{%.*}}, 0
1091+
// CHECK: [[CALL_RES1:%.*]] = extractvalue { i64, i64, i64, i64 } {{%.*}}, 1
1092+
// CHECK: [[CALL_RES2:%.*]] = extractvalue { i64, i64, i64, i64 } {{%.*}}, 2
1093+
// CHECK: [[CALL_RES3:%.*]] = extractvalue { i64, i64, i64, i64 } {{%.*}}, 3
1094+
// CHECK: [[ERROR_FLAG:%.*]] = extractvalue { ptr, i64, i64, i64, i64, ptr } [[CALL_RES]], 5
1095+
// CHECK: store ptr [[ERROR_FLAG]], ptr %swifterror, align 8
1096+
// CHECK: [[ERROR:%.*]] = load ptr, ptr %swifterror, align 8
1097+
// CHECK: [[ISERROR:%.*]] = icmp ne ptr [[ERROR]], null
1098+
// CHECK: br i1 [[ISERROR]], label %typed.error.load, label %[[SUCCESS:.*]]
1099+
// CHECK: typed.error.load:
1100+
// CHECK: br label %[[SET_ERROR:.*]]
1101+
// CHECK: [[SUCCESS]]:
1102+
// CHECK: [[SUCCESS_RES0:%.*]] = phi i64 [ [[CALL_RES0]], %entry ]
1103+
// CHECK: [[SUCCESS_RES1:%.*]] = phi i64 [ [[CALL_RES1]], %entry ]
1104+
// CHECK: [[SUCCESS_RES2:%.*]] = phi i64 [ [[CALL_RES2]], %entry ]
1105+
// CHECK: [[SUCCESS_RES3:%.*]] = phi i64 [ [[CALL_RES3]], %entry ]
1106+
// CHECK: br label %[[COMMON_RET:.*]]
1107+
// CHECK: [[COMMON_RET]]:
1108+
// CHECK: [[RETVAL0:%.*]] = phi i64 [ 0, %[[SET_ERROR]] ], [ [[SUCCESS_RES0]], %[[SUCCESS]] ]
1109+
// CHECK: [[RETVAL1:%.*]] = phi i64 [ 0, %[[SET_ERROR]] ], [ [[SUCCESS_RES1]], %[[SUCCESS]] ]
1110+
// CHECK: [[RETVAL2:%.*]] = phi i64 [ 0, %[[SET_ERROR]] ], [ [[SUCCESS_RES2]], %[[SUCCESS]] ]
1111+
// CHECK: [[RETVAL3:%.*]] = phi i64 [ 0, %[[SET_ERROR]] ], [ [[SUCCESS_RES3]], %[[SUCCESS]] ]
1112+
// CHECK: call i1 (ptr, i1, ...) @llvm.coro.end.async(ptr [[CORO]], i1 false, ptr @"{{.*}}", ptr {{%.*}}, ptr {{%.*}}, i64 [[RETVAL0]], i64 [[RETVAL1]], i64 [[RETVAL2]], i64 [[RETVAL3]])
1113+
// CHECK: unreachable
1114+
// CHECK: [[SET_ERROR]]:
1115+
// CHECK: store ptr null, ptr %swifterror, align 8
1116+
// CHECK: br label %[[COMMON_RET]]
1117+
// CHECK: }
1118+
@available(SwiftStdlib 6.0, *)
1119+
func callImplAsync_f4(_ impl: ImplAsync, _ b: Bool) async -> (Int, Int, Int, Int) {
1120+
do {
1121+
return try await impl.f4(b)
1122+
} catch {
1123+
return (0, 0, 0, 0)
1124+
}
1125+
}
1126+
1127+
// CHECK: define hidden swifttailcc void @"$s16typed_throws_abi16callImplAsync_f5ySi_S4itAA0eF0V_SbtYaF"(ptr noalias nocapture %0, ptr swiftasync %1, i1 %2)
1128+
// CHECK: %swifterror = alloca ptr, align 8
1129+
// CHECK: %call.aggresult = alloca <{ %TSi, %TSi, %TSi, %TSi, %TSi }>, align 8
1130+
// CHECK: %swifterror1 = alloca swifterror ptr, align 8
1131+
// CHECK: [[CALL:%.*]] = call token @llvm.coro.id.async(i32 16, i32 16, i32 1, ptr @"$s16typed_throws_abi16callImplAsync_f5ySi_S4itAA0eF0V_SbtYaFTu")
1132+
// CHECK: [[CORO:%.*]] = call ptr @llvm.coro.begin(token [[CALL]], ptr null)
1133+
// CHECK: store ptr null, ptr %swifterror1, align 8
1134+
// CHECK: [[CORO_RESUME:%.*]] = call ptr @llvm.coro.async.resume()
1135+
// CHECK: [[CALL_RES:%.*]] = call { ptr, ptr } (i32, ptr, ptr, ...) @llvm.coro.suspend.async.sl_p0p0s(i32 {{[0-9]+}}, ptr [[CORO_RESUME]], ptr @__swift_async_resume_project_context, ptr @"{{.*}}", ptr %call.aggresult, ptr {{%.*}}, i1 %2, ptr %swifterror)
1136+
// CHECK: [[ERROR_FLAG:%.*]] = extractvalue { ptr, ptr } [[CALL_RES]], 1
1137+
// CHECK: store ptr [[ERROR_FLAG]], ptr %swifterror1, align 8
1138+
// CHECK: [[CALL_RES0:%.*]] = load i64, ptr %call.aggresult.elt{{.*}}, align 8
1139+
// CHECK: [[CALL_RES1:%.*]] = load i64, ptr %call.aggresult.elt{{.*}}, align 8
1140+
// CHECK: [[CALL_RES2:%.*]] = load i64, ptr %call.aggresult.elt{{.*}}, align 8
1141+
// CHECK: [[CALL_RES3:%.*]] = load i64, ptr %call.aggresult.elt{{.*}}, align 8
1142+
// CHECK: [[CALL_RES4:%.*]] = load i64, ptr %call.aggresult.elt{{.*}}, align 8
1143+
// CHECK: [[ERROR:%.*]] = load ptr, ptr %swifterror1, align 8
1144+
// CHECK: [[ISERROR:%.*]] = icmp ne ptr [[ERROR]], null
1145+
// CHECK: br i1 [[ISERROR]], label %typed.error.load, label %[[SUCCESS:.*]]
1146+
// CHECK: typed.error.load:
1147+
// CHECK: br label %[[SET_ERROR:.*]]
1148+
// CHECK: [[SUCCESS]]:
1149+
// CHECK: [[SUCCESS_RES0:%.*]] = phi i64 [ [[CALL_RES0]], %entry ]
1150+
// CHECK: [[SUCCESS_RES1:%.*]] = phi i64 [ [[CALL_RES1]], %entry ]
1151+
// CHECK: [[SUCCESS_RES2:%.*]] = phi i64 [ [[CALL_RES2]], %entry ]
1152+
// CHECK: [[SUCCESS_RES3:%.*]] = phi i64 [ [[CALL_RES3]], %entry ]
1153+
// CHECK: [[SUCCESS_RES4:%.*]] = phi i64 [ [[CALL_RES4]], %entry ]
1154+
// CHECK: br label %[[COMMON_RET:.*]]
1155+
// CHECK: [[COMMON_RET]]:
1156+
// CHECK: [[RETVAL0:%.*]] = phi i64 [ 0, %[[SET_ERROR]] ], [ [[SUCCESS_RES0]], %[[SUCCESS]] ]
1157+
// CHECK: [[RETVAL1:%.*]] = phi i64 [ 0, %[[SET_ERROR]] ], [ [[SUCCESS_RES1]], %[[SUCCESS]] ]
1158+
// CHECK: [[RETVAL2:%.*]] = phi i64 [ 0, %[[SET_ERROR]] ], [ [[SUCCESS_RES2]], %[[SUCCESS]] ]
1159+
// CHECK: [[RETVAL3:%.*]] = phi i64 [ 0, %[[SET_ERROR]] ], [ [[SUCCESS_RES3]], %[[SUCCESS]] ]
1160+
// CHECK: [[RETVAL4:%.*]] = phi i64 [ 0, %[[SET_ERROR]] ], [ [[SUCCESS_RES4]], %[[SUCCESS]] ]
1161+
// CHECK: store i64 [[RETVAL0]], ptr %.elt{{.*}}, align 8
1162+
// CHECK: store i64 [[RETVAL1]], ptr %.elt{{.*}}, align 8
1163+
// CHECK: store i64 [[RETVAL2]], ptr %.elt{{.*}}, align 8
1164+
// CHECK: store i64 [[RETVAL3]], ptr %.elt{{.*}}, align 8
1165+
// CHECK: store i64 [[RETVAL4]], ptr %.elt{{.*}}, align 8
1166+
// CHECK: call i1 (ptr, i1, ...) @llvm.coro.end.async(ptr [[CORO]], i1 false, ptr @"{{.*}}", ptr {{%.*}}, ptr {{%.*}})
1167+
// CHECK: unreachable
1168+
// CHECK: [[SET_ERROR]]:
1169+
// CHECK: store ptr null, ptr %swifterror1, align 8
1170+
// CHECK: br label %[[COMMON_RET]]
1171+
// CHECK: }
1172+
@available(SwiftStdlib 6.0, *)
1173+
func callImplAsync_f5(_ impl: ImplAsync, _ b: Bool) async -> (Int, Int, Int, Int, Int) {
1174+
do {
1175+
return try await impl.f5(b)
1176+
} catch {
1177+
return (0, 0, 0, 0, 0)
1178+
}
1179+
}
1180+
9351181
protocol P {
9361182
// 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)
9371183
// CHECK: [[ERROR:%.*]] = load ptr, ptr %2

0 commit comments

Comments
 (0)