Commit Graph

3 Commits

Author SHA1 Message Date
Ryan Mansfield
9c2de27a4b [Tests] Double timeout in closure_specialize_loop.swift.
Fix test failure in debug builds.
2024-08-19 10:57:05 -04:00
Andrew Trick
c665311626 Fix infinite recursion in ClosureSpecialize
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 #61955
https://github.com/apple/swift/issues/61955

Fixes rdar://101589190 (Swift Compiler hangs when building this code for release)
2022-11-07 14:44:04 -08:00
Erik Eckstein
67e34d5b8e ClosureSpecializer: avoid an infinite optimization loop.
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
2021-08-24 11:48:32 +02:00