Skip to content

Commit d011771

Browse files
authored
Merge pull request #69401 from eeckstein/noallocation-with-precondition
Add some instruction simplifications to make `precondition()` not allocate in Onone builds
2 parents a94d22e + d27ca6a commit d011771

26 files changed

+255
-40
lines changed

SwiftCompilerSources/Sources/Optimizer/InstructionSimplification/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@ swift_compiler_sources(Optimizer
1313
SimplifyBuiltin.swift
1414
SimplifyCondBranch.swift
1515
SimplifyCondFail.swift
16+
SimplifyConvertEscapeToNoEscape.swift
17+
SimplifyCopyValue.swift
1618
SimplifyDebugStep.swift
19+
SimplifyDestroyValue.swift
1720
SimplifyDestructure.swift
1821
SimplifyGlobalValue.swift
1922
SimplifyInitEnumDataAddr.swift

SwiftCompilerSources/Sources/Optimizer/InstructionSimplification/SimplifyApply.swift

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ import SIL
1414

1515
extension ApplyInst : OnoneSimplifyable {
1616
func simplify(_ context: SimplifyContext) {
17+
if tryTransformThickToThinCallee(of: self, context) {
18+
return
19+
}
1720
_ = context.tryDevirtualize(apply: self, isMandatory: false)
1821
}
1922
}
@@ -29,3 +32,29 @@ extension BeginApplyInst : OnoneSimplifyable {
2932
_ = context.tryDevirtualize(apply: self, isMandatory: false)
3033
}
3134
}
35+
36+
/// Optimizes a thick function call if the callee is a `thin_to_thick_function` instruction:
37+
///
38+
/// %2 = thin_to_thick_function %1
39+
/// %3 = apply %2(...) : @callee_guaranteed
40+
/// ->
41+
/// %2 = thin_to_thick_function %1
42+
/// %3 = apply %1(...): @convention(thin)
43+
///
44+
private func tryTransformThickToThinCallee(of apply: ApplyInst, _ context: SimplifyContext) -> Bool {
45+
if let tttf = apply.callee as? ThinToThickFunctionInst,
46+
!apply.callee.type.isCalleeConsumedFunction
47+
{
48+
let builder = Builder(before: apply, context)
49+
let newApply = builder.createApply(function: tttf.operand.value,
50+
apply.substitutionMap,
51+
arguments: Array(apply.arguments),
52+
isNonThrowing: apply.isNonThrowing,
53+
isNonAsync: apply.isNonAsync,
54+
specializationInfo: apply.specializationInfo)
55+
apply.uses.replaceAll(with: newApply, context)
56+
context.erase(instruction: apply)
57+
return true
58+
}
59+
return false
60+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
//===--- SimplifyConvertEscapeToNoEscape.swift ----------------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2014 - 2023 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
import SIL
14+
15+
extension ConvertEscapeToNoEscapeInst : OnoneSimplifyable {
16+
func simplify(_ context: SimplifyContext) {
17+
tryCombineWithThinToThickOperand(context)
18+
}
19+
}
20+
21+
private extension ConvertEscapeToNoEscapeInst {
22+
23+
/// Combine with a thin_to_thick_function operand:
24+
///
25+
/// %2 = thin_to_thick_function %1 to $() -> ()
26+
/// %3 = convert_escape_to_noescape %2 : $() -> () to $@noescape () -> ()
27+
/// ->
28+
/// %3 = thin_to_thick_function %1 to $@noescape () -> ()
29+
30+
func tryCombineWithThinToThickOperand(_ context: SimplifyContext) {
31+
if let thinToThick = fromFunction as? ThinToThickFunctionInst {
32+
let builder = Builder(before: self, context)
33+
let noEscapeFnType = thinToThick.type.getFunctionType(withNoEscape: true)
34+
let newThinToThick = builder.createThinToThickFunction(thinFunction: thinToThick.operand.value,
35+
resultType: noEscapeFnType)
36+
uses.replaceAll(with: newThinToThick, context)
37+
context.erase(instruction: self)
38+
}
39+
}
40+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
//===--- SimplifyCopyValue.swift ------------------------------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2014 - 2023 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
import SIL
14+
15+
extension CopyValueInst : OnoneSimplifyable, SILCombineSimplifyable {
16+
func simplify(_ context: SimplifyContext) {
17+
if fromValue.ownership == .none {
18+
uses.replaceAll(with: fromValue, context)
19+
context.erase(instruction: self)
20+
}
21+
}
22+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
//===--- SimplifyDestroyValue.swift ---------------------------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2014 - 2023 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
import SIL
14+
15+
extension DestroyValueInst : OnoneSimplifyable, SILCombineSimplifyable {
16+
func simplify(_ context: SimplifyContext) {
17+
if destroyedValue.ownership == .none {
18+
context.erase(instruction: self)
19+
}
20+
}
21+
}

SwiftCompilerSources/Sources/Optimizer/PassManager/PassRegistration.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@ private func registerSwiftPasses() {
9797
registerForSILCombine(RetainValueInst.self, { run(RetainValueInst.self, $0) })
9898
registerForSILCombine(ReleaseValueInst.self, { run(ReleaseValueInst.self, $0) })
9999
registerForSILCombine(LoadInst.self, { run(LoadInst.self, $0) })
100+
registerForSILCombine(CopyValueInst.self, { run(CopyValueInst.self, $0) })
101+
registerForSILCombine(DestroyValueInst.self, { run(DestroyValueInst.self, $0) })
100102

101103
// Test passes
102104
registerPass(functionUsesDumper, { functionUsesDumper.run($0) })

SwiftCompilerSources/Sources/SIL/Builder.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,11 @@ public struct Builder {
220220
return notifyNew(enumInst.getAs(EnumInst.self))
221221
}
222222

223+
public func createThinToThickFunction(thinFunction: Value, resultType: Type) -> ThinToThickFunctionInst {
224+
let tttf = bridged.createThinToThickFunction(thinFunction.bridged, resultType.bridged)
225+
return notifyNew(tttf.getAs(ThinToThickFunctionInst.self))
226+
}
227+
223228
@discardableResult
224229
public func createSwitchEnum(enum enumVal: Value,
225230
cases: [(Int, BasicBlock)],

SwiftCompilerSources/Sources/SIL/Instruction.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -794,6 +794,11 @@ class ConvertFunctionInst : SingleValueInstruction, ConversionInstruction {
794794
final public
795795
class ThinToThickFunctionInst : SingleValueInstruction, ConversionInstruction {}
796796

797+
final public
798+
class ConvertEscapeToNoEscapeInst : SingleValueInstruction, UnaryInstruction {
799+
public var fromFunction: Value { operand.value }
800+
}
801+
797802
final public
798803
class ObjCExistentialMetatypeToObjectInst : SingleValueInstruction,
799804
ConversionInstruction {}

SwiftCompilerSources/Sources/SIL/Registration.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ public func registerSILClasses() {
131131
register(UnconditionalCheckedCastInst.self)
132132
register(ConvertFunctionInst.self)
133133
register(ThinToThickFunctionInst.self)
134+
register(ConvertEscapeToNoEscapeInst.self)
134135
register(ObjCExistentialMetatypeToObjectInst.self)
135136
register(ObjCMetatypeToObjectInst.self)
136137
register(ValueToBridgeObjectInst.self)

SwiftCompilerSources/Sources/SIL/Type.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,10 @@ public struct Type : CustomStringConvertible, NoReflectionChildren {
111111
return idx >= 0 ? idx : nil
112112
}
113113

114+
public func getFunctionType(withNoEscape: Bool) -> Type {
115+
bridged.getFunctionTypeWithNoEscape(withNoEscape).type
116+
}
117+
114118
public var description: String {
115119
String(taking: bridged.getDebugDescription())
116120
}

include/swift/SIL/SILBridging.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ struct BridgedType {
129129
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedStringRef getFieldName(SwiftInt idx) const;
130130
BRIDGED_INLINE SwiftInt getNumTupleElements() const;
131131
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedType getTupleElementType(SwiftInt idx) const;
132+
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedType getFunctionTypeWithNoEscape(bool withNoEscape) const;
132133
};
133134

134135
// AST bridging
@@ -899,6 +900,8 @@ struct BridgedBuilder{
899900
SwiftInt caseIdx, BridgedType resultType) const;
900901
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedInstruction createEnum(SwiftInt caseIdx, OptionalBridgedValue payload,
901902
BridgedType resultType) const;
903+
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedInstruction createThinToThickFunction(BridgedValue fn,
904+
BridgedType resultType) const;
902905
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedInstruction createBranch(BridgedBasicBlock destBlock,
903906
BridgedValueArray arguments) const;
904907
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedInstruction createUnreachable() const;

include/swift/SIL/SILBridgingImpl.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,12 @@ BridgedType BridgedType::getTupleElementType(SwiftInt idx) const {
217217
return get().getTupleElementType(idx);
218218
}
219219

220+
BridgedType BridgedType::getFunctionTypeWithNoEscape(bool withNoEscape) const {
221+
auto fnType = get().getAs<swift::SILFunctionType>();
222+
auto newTy = fnType->getWithExtInfo(fnType->getExtInfo().withNoEscape(true));
223+
return swift::SILType::getPrimitiveObjectType(newTy);
224+
}
225+
220226
//===----------------------------------------------------------------------===//
221227
// BridgedNominalTypeDecl
222228
//===----------------------------------------------------------------------===//
@@ -1352,6 +1358,10 @@ BridgedInstruction BridgedBuilder::createEnum(SwiftInt caseIdx, OptionalBridgedV
13521358
return {get().createEnum(regularLoc(), pl, caseDecl, resultType.get())};
13531359
}
13541360

1361+
BridgedInstruction BridgedBuilder::createThinToThickFunction(BridgedValue fn, BridgedType resultType) const {
1362+
return {get().createThinToThickFunction(regularLoc(), fn.getSILValue(), resultType.get())};
1363+
}
1364+
13551365
BridgedInstruction BridgedBuilder::createBranch(BridgedBasicBlock destBlock, BridgedValueArray arguments) const {
13561366
llvm::SmallVector<swift::SILValue, 16> argValues;
13571367
return {get().createBranch(regularLoc(), destBlock.get(), arguments.getValues(argValues))};

include/swift/SILOptimizer/PassManager/Passes.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,8 @@ SWIFT_SILCOMBINE_PASS(StrongReleaseInst)
493493
SWIFT_SILCOMBINE_PASS(RetainValueInst)
494494
SWIFT_SILCOMBINE_PASS(ReleaseValueInst)
495495
SWIFT_SILCOMBINE_PASS(LoadInst)
496+
SWIFT_SILCOMBINE_PASS(CopyValueInst)
497+
SWIFT_SILCOMBINE_PASS(DestroyValueInst)
496498

497499
#undef IRGEN_PASS
498500
#undef SWIFT_MODULE_PASS

lib/SILOptimizer/SILCombiner/SILCombiner.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,8 +241,6 @@ class SILCombiner :
241241
SILInstruction *optimizeStringObject(BuiltinInst *BI);
242242
SILInstruction *visitBuiltinInst(BuiltinInst *BI);
243243
SILInstruction *visitCondFailInst(CondFailInst *CFI);
244-
SILInstruction *visitCopyValueInst(CopyValueInst *cvi);
245-
SILInstruction *visitDestroyValueInst(DestroyValueInst *dvi);
246244
SILInstruction *visitRefToRawPointerInst(RefToRawPointerInst *RRPI);
247245
SILInstruction *visitUpcastInst(UpcastInst *UCI);
248246

lib/SILOptimizer/SILCombiner/SILCombinerMiscVisitors.cpp

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -865,37 +865,6 @@ SILInstruction *SILCombiner::visitCondFailInst(CondFailInst *CFI) {
865865
return nullptr;
866866
}
867867

868-
SILInstruction *SILCombiner::visitCopyValueInst(CopyValueInst *cvi) {
869-
assert(cvi->getFunction()->hasOwnership());
870-
871-
// Sometimes when RAUWing code we get copy_value on .none values (consider
872-
// transformations around function types that result in given a copy_value a
873-
// thin_to_thick_function argument). In such a case, just RAUW with the
874-
// copy_value's operand since it is a no-op.
875-
if (cvi->getOperand()->getOwnershipKind() == OwnershipKind::None) {
876-
replaceInstUsesWith(*cvi, cvi->getOperand());
877-
return eraseInstFromFunction(*cvi);
878-
}
879-
880-
return nullptr;
881-
}
882-
883-
SILInstruction *SILCombiner::visitDestroyValueInst(DestroyValueInst *dvi) {
884-
assert(dvi->getFunction()->hasOwnership());
885-
886-
// Sometimes when RAUWing code we get destroy_value on .none values. In such a
887-
// case, just delete the destroy_value.
888-
//
889-
// As an example, consider transformations around function types that result
890-
// in a thin_to_thick_function being passed to a destroy_value.
891-
if (dvi->getOperand()->getOwnershipKind() == OwnershipKind::None) {
892-
eraseInstFromFunction(*dvi);
893-
return nullptr;
894-
}
895-
896-
return nullptr;
897-
}
898-
899868
/// Create a value from stores to an address.
900869
///
901870
/// If there are only stores to \p addr, return the stored value. Also, if there

test/IRGen/big_types_corner_cases.sil

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: %target-swift-frontend -I %S/Inputs/abi %s -emit-ir | %FileCheck %s
1+
// RUN: %target-swift-frontend -Xllvm -sil-disable-pass=simplification -I %S/Inputs/abi %s -emit-ir | %FileCheck %s
22

33
// REQUIRES: CPU=x86_64
44
// REQUIRES: OS=macosx

test/SILGen/reabstract.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
// RUN: %target-swift-emit-silgen -module-name reabstract -Xllvm -sil-full-demangle %s | %FileCheck %s
3-
// RUN: %target-swift-emit-sil -module-name reabstract -Xllvm -sil-full-demangle %s | %FileCheck %s --check-prefix=MANDATORY
3+
// RUN: %target-swift-emit-sil -module-name reabstract -Xllvm -sil-disable-pass=simplification -Xllvm -sil-full-demangle %s | %FileCheck %s --check-prefix=MANDATORY
44

55
func closureTakingOptional(_ fn: (Int?) -> ()) {}
66
closureTakingOptional({ (_: Any) -> () in })

test/SILGen/rethrows.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

2-
// RUN: %target-swift-emit-sil -module-name rethrows -verify %s | %FileCheck %s
2+
// RUN: %target-swift-emit-sil -module-name rethrows -Xllvm -sil-disable-pass=simplification -verify %s | %FileCheck %s
33

44
@discardableResult
55
func rethrower(_ fn: () throws -> Int) rethrows -> Int {

test/SILOptimizer/definite-init-convert-to-escape.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@ public func returnOptionalEscape() -> (() ->())?
6767
// CHECK: [[BLOCK_PROJ:%.*]] = project_block_storage [[BLOCK_SLOT]]
6868
// CHECK: store [[MDI]] to [[BLOCK_PROJ]]
6969
// CHECK: [[BLOCK:%.*]] = init_block_storage_header [[BLOCK_SLOT]]
70-
// CHECK: release_value [[NONE]]
7170
// CHECK: [[SOME_2:%.*]] = enum $Optional<{{.*}}>, #Optional.some!enumelt, [[MDI]]
7271
// CHECK: [[BLOCK_COPY:%.*]] = copy_block [[BLOCK]]
7372
// CHECK: [[BLOCK_SOME:%.*]] = enum $Optional<{{.*}}>, #Optional.some!enumelt, [[BLOCK_COPY]]

test/SILOptimizer/definite_init_value_types.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
// RUN: %target-swift-frontend -enable-copy-propagation=requested-passes-only -enable-lexical-lifetimes=false -emit-sil %s | %FileCheck %s
22

3+
// REQUIRES: swift_in_compiler
4+
35
enum ValueEnum {
46
case a(String)
57
case b
@@ -57,7 +59,6 @@ enum ValueEnum {
5759
// CHECK: bb6:
5860
// CHECK-NEXT: [[NEW_STATE:%.*]] = integer_literal $Builtin.Int1, -1
5961
// CHECK-NEXT: store [[NEW_STATE]] to [[STATE]]
60-
// CHECK-NEXT: retain_value [[NEW_SELF]]
6162
// CHECK-NEXT: store [[NEW_SELF]] to [[SELF_ACCESS]]
6263
// CHECK-NEXT: end_access [[SELF_ACCESS]]
6364
// CHECK-NEXT: destroy_addr [[SELF_BOX]]

test/SILOptimizer/mandatory_inlining_reasync.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ func reasyncFunction(_ value: Optional<Int>, _ fn: () async throws -> Int) reasy
1313

1414
// CHECK-LABEL: sil hidden @$s26mandatory_inlining_reasync20callsReasyncFunctionSiyF : $@convention(thin) () -> Int {
1515
// CHECK: [[FN:%.*]] = function_ref @$s26mandatory_inlining_reasync20callsReasyncFunctionSiyFSiyXEfU_ : $@convention(thin) () -> Int
16-
// CHECK-NEXT: [[THICK:%.*]] = thin_to_thick_function [[FN]] : $@convention(thin) () -> Int to $@noescape @callee_guaranteed () -> Int
17-
// CHECK-NEXT: [[RESULT:%.*]] = apply [[THICK]]() : $@noescape @callee_guaranteed () -> Int
16+
// CHECK-NEXT: [[RESULT:%.*]] = apply [[FN]]() : $@convention(thin) () -> Int
1817
// CHECK-NEXT: return [[RESULT]] : $Int
1918
func callsReasyncFunction() -> Int {
2019
return reasyncFunction(nil, { return 321 } )

test/SILOptimizer/performance-annotations.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,3 +412,8 @@ func testInfiniteLoop(_ c: Cl) {
412412
while true {}
413413
}
414414

415+
@_noAllocation
416+
func testPrecondition(_ count: Int) {
417+
precondition(count == 2, "abc")
418+
}
419+

test/SILOptimizer/simplify_apply.sil

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,20 @@ class Bar {
1313
func foo() -> Int
1414
}
1515

16+
sil @cl : $@convention(thin) () -> Int
17+
18+
// CHECK-LABEL: sil [ossa] @thick_to_thin :
19+
// CHECK: [[F:%.*]] = function_ref @cl
20+
// CHECK: apply [[F]]() : $@convention(thin
21+
// CHECK: } // end sil function 'thick_to_thin'
22+
sil [ossa] @thick_to_thin : $@convention(thin) () -> Int {
23+
bb0:
24+
%0 = function_ref @cl : $@convention(thin) () -> Int
25+
%1 = thin_to_thick_function %0 : $@convention(thin) () -> Int to $@callee_guaranteed () -> Int
26+
%2 = apply %1() : $@callee_guaranteed () -> Int
27+
return %2 : $Int
28+
}
29+
1630
// CHECK-LABEL: sil @devirt_class_method :
1731
// CHECK: [[F:%.*]] = function_ref @bar_foo
1832
// CHECK: apply [[F]]
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// RUN: %target-sil-opt -enable-sil-verify-all %s -onone-simplification -simplify-instruction=convert_escape_to_noescape | %FileCheck %s
2+
3+
// REQUIRES: swift_in_compiler
4+
5+
sil_stage canonical
6+
7+
import Builtin
8+
import Swift
9+
import SwiftShims
10+
11+
sil @cl : $@convention(thin) () -> Int
12+
13+
// CHECK-LABEL: sil [ossa] @remove_convert :
14+
// CHECK: [[F:%.*]] = thin_to_thick_function %0 : $@convention(thin) () -> Int to $@noescape @callee_guaranteed () -> Int
15+
// CHECK-NEXT: apply [[F]]() : $@noescape
16+
// CHECK-NEXT: destroy_value [[F]]
17+
// CHECK: } // end sil function 'remove_convert'
18+
sil [ossa] @remove_convert : $@convention(thin) () -> Int {
19+
bb0:
20+
%0 = function_ref @cl : $@convention(thin) () -> Int
21+
%1 = thin_to_thick_function %0 : $@convention(thin) () -> Int to $@callee_guaranteed () -> Int
22+
%2 = convert_escape_to_noescape %1 : $@callee_guaranteed () -> Int to $@noescape @callee_guaranteed () -> Int
23+
%3 = apply %2() : $@noescape @callee_guaranteed () -> Int
24+
destroy_value %2 : $@noescape @callee_guaranteed () -> Int
25+
return %3 : $Int
26+
}
27+
28+

0 commit comments

Comments
 (0)