mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
SILGen: Emit a closure literal in a function conversion as the converted type.
Closure literals are sometimes type-checked as one type then immediately converted to another type in the AST. One particular case of this is when a closure body never throws, but the closure is used as an argument to a function that takes a parameter that `throws`. Emitting this naively, by emitting the closure as its original type, then converting to throws, can be expensive for async closures, since that takes a reabstraction thunk. Even for non-async functions, we still want to get the benefit of reabstraction optimization for the closure literal through the conversion too. So if the function conversion just add `throws`, emit the closure as throwing, and pass down the context abstraction pattern when emitting the closure as well.
This commit is contained in:
@@ -35,7 +35,7 @@ public func mangle(s: [UnicodeScalar]) -> [UnicodeScalar] {
|
||||
// Do we care to expose these via lldb?
|
||||
|
||||
// CHECK: define {{.*}}@"$s11patternvars6mangle1sSayAA13UnicodeScalarVGAF_tFA2EXEfU_"
|
||||
// CHECK: %[[VAL:[0-9]+]] = call swiftcc i32 @"$s11patternvars13UnicodeScalarV5values6UInt32Vvg"(i32 %0)
|
||||
// CHECK: %[[VAL:[0-9]+]] = call swiftcc i32 @"$s11patternvars13UnicodeScalarV5values6UInt32Vvg"(
|
||||
// CHECK: {{[0-9]+}}:
|
||||
// CHECK-NOT: call void @llvm.dbg.value
|
||||
// CHECK-NOT: call void asm sideeffect "", "r"
|
||||
|
||||
Reference in New Issue
Block a user