File tree Expand file tree Collapse file tree 2 files changed +41
-0
lines changed
lib/SILOptimizer/Mandatory Expand file tree Collapse file tree 2 files changed +41
-0
lines changed Original file line number Diff line number Diff line change @@ -319,6 +319,27 @@ static SILFunction *getCalleeFunction(
319
319
// would be a good optimization to handle and would be as simple as inserting
320
320
// a cast.
321
321
auto skipFuncConvert = [](SILValue CalleeValue) {
322
+ // We can also allow a thin @escape to noescape conversion as such:
323
+ // %1 = function_ref @thin_closure_impl : $@convention(thin) () -> ()
324
+ // %2 = convert_function %1 :
325
+ // $@convention(thin) () -> () to $@convention(thin) @noescape () -> ()
326
+ // %3 = thin_to_thick_function %2 :
327
+ // $@convention(thin) @noescape () -> () to
328
+ // $@noescape @callee_guaranteed () -> ()
329
+ // %4 = apply %3() : $@noescape @callee_guaranteed () -> ()
330
+ if (auto *ThinToNoescapeCast = dyn_cast<ConvertFunctionInst>(CalleeValue)) {
331
+ auto FromCalleeTy =
332
+ ThinToNoescapeCast->getOperand ()->getType ().castTo <SILFunctionType>();
333
+ if (FromCalleeTy->getExtInfo ().hasContext ())
334
+ return CalleeValue;
335
+ auto ToCalleeTy = ThinToNoescapeCast->getType ().castTo <SILFunctionType>();
336
+ auto EscapingCalleeTy = ToCalleeTy->getWithExtInfo (
337
+ ToCalleeTy->getExtInfo ().withNoEscape (false ));
338
+ if (FromCalleeTy != EscapingCalleeTy)
339
+ return CalleeValue;
340
+ return ThinToNoescapeCast->getOperand ();
341
+ }
342
+
322
343
auto *CFI = dyn_cast<ConvertEscapeToNoEscapeInst>(CalleeValue);
323
344
if (!CFI)
324
345
return CalleeValue;
Original file line number Diff line number Diff line change @@ -1184,3 +1184,23 @@ bb0(%0: $C):
1184
1184
apply %closure() : $@callee_guaranteed () -> ()
1185
1185
return %closure : $@callee_guaranteed () -> ()
1186
1186
}
1187
+
1188
+
1189
+ sil [transparent] @return_one : $@convention(thin) () -> Builtin.Int32 {
1190
+ bb0:
1191
+ %0 = integer_literal $Builtin.Int32, 1
1192
+ return %0 : $Builtin.Int32
1193
+ }
1194
+
1195
+ // CHECK-LABEL: sil @test_thin_convert_function_inline
1196
+ // CHECK-NEXT: bb0
1197
+ // CHECK-NEXT: [[RES:%.*]] = integer_literal $Builtin.Int32, 1
1198
+ // CHECK-NEXT return [[RES]]
1199
+ sil @test_thin_convert_function_inline : $@convention(thin) () -> Builtin.Int32 {
1200
+ bb0:
1201
+ %0 = function_ref @return_one : $@convention(thin) () -> Builtin.Int32
1202
+ %1 = convert_function %0 : $@convention(thin) () -> Builtin.Int32 to $@convention(thin) @noescape () -> Builtin.Int32
1203
+ %2 = thin_to_thick_function %1 : $@convention(thin) @noescape () -> Builtin.Int32 to $@noescape () -> Builtin.Int32
1204
+ %3 = apply %2() : $@noescape () -> Builtin.Int32
1205
+ return %3 : $Builtin.Int32
1206
+ }
You can’t perform that action at this time.
0 commit comments