Fixes getSpecializationLevelRecursive to handle recursive manglings caused by interleaving CapturePropagation and ClosureSpecialize passes.
For some reason, only the first closure parameter was checked for recursion. We need to handle patterns like this:
kind=FunctionSignatureSpecialization
kind=SpecializationPassID, index=3
kind=FunctionSignatureSpecializationParam
kind=FunctionSignatureSpecializationParam
kind=FunctionSignatureSpecializationParamKind, index=0
kind=FunctionSignatureSpecializationParamPayload, text="$s4test10ExpressionO8contains5whereS3bXE_tFSbACXEfU_S2bXEfU_36$s4test12IndirectEnumVACycfcS2bXEfU_Tf3npf_n"
I fixed the logic so we now check for recursion on all closure parameters and bail out on unrecognized mangling formats.
For reference, see summary.sil in
Infinitely recursive closure specialization #61955https://github.com/apple/swift/issues/61955
Fixes rdar://101589190 (Swift Compiler hangs when building this code for release)
Avoid an infinite specialization loop caused by repeated runs of the ClosureSpecializer and CapturePropagation.
CapturePropagation propagates constant function-literals.
Such function specializations can then be optimized again by the ClosureSpecializer and so on.
This happens if a closure argument is called _and_ referenced in another closure, which is passed to a recursive call. E.g.
func foo(_ c: @escaping () -> ()) {
c()
foo({ c() })
}
rdar://80752327