@@ -65,12 +65,16 @@ let allocBoxToStack = FunctionPass(name: "allocbox-to-stack") {
6565let mandatoryAllocBoxToStack = ModulePass ( name: " mandatory-allocbox-to-stack " ) {
6666 ( moduleContext: ModulePassContext ) in
6767
68+ var worklist = FunctionWorklist ( )
69+ worklist. pushIfNotVisited ( contentsOf: moduleContext. functions)
70+
6871 var originalsOfSpecializedFunctions = FunctionWorklist ( )
6972
70- for function in moduleContext . functions {
73+ while let function = worklist . pop ( ) {
7174 moduleContext. transform ( function: function) { context in
7275 let specFns = tryConvertBoxesToStack ( in: function, context)
73- originalsOfSpecializedFunctions. pushIfNotVisited ( contentsOf: specFns)
76+ worklist. pushIfNotVisited ( contentsOf: specFns. specializedFunctions)
77+ originalsOfSpecializedFunctions. pushIfNotVisited ( contentsOf: specFns. originalFunctions)
7478 }
7579 }
7680
@@ -82,7 +86,7 @@ let mandatoryAllocBoxToStack = ModulePass(name: "mandatory-allocbox-to-stack") {
8286/// Converts all non-escaping `alloc_box` to `alloc_stack` and specializes called functions if a
8387/// box is passed to a function.
8488/// Returns the list of original functions for which a specialization has been created.
85- private func tryConvertBoxesToStack( in function: Function , _ context: FunctionPassContext ) -> [ Function ] {
89+ private func tryConvertBoxesToStack( in function: Function , _ context: FunctionPassContext ) -> FunctionSpecializations {
8690 var promotableBoxes = Array < ( AllocBoxInst , Flags ) > ( )
8791 var functionsToSpecialize = FunctionSpecializations ( )
8892
@@ -101,7 +105,7 @@ private func tryConvertBoxesToStack(in function: Function, _ context: FunctionPa
101105 function. fixStackNesting ( context)
102106 }
103107
104- return functionsToSpecialize. originalFunctions
108+ return functionsToSpecialize
105109}
106110
107111private func findPromotableBoxes( in function: Function ,
@@ -187,6 +191,7 @@ private struct FunctionSpecializations {
187191 private var originalToSpecialized = Dictionary < Function , Function > ( )
188192
189193 var originalFunctions : [ Function ] { originals. functions }
194+ var specializedFunctions : [ Function ] { originals. functions. lazy. map { originalToSpecialized [ $0] ! } }
190195
191196 mutating func add( promotableArguments: [ FunctionArgument ] ) {
192197 for arg in promotableArguments {
0 commit comments