import pass_pipeline as ppipe import passes as p def simplifycfg_silcombine_passlist(): return ppipe.PassList([ p.SimplifyCFG, p.SILCombine, p.SimplifyCFG, ]) def highlevel_loopopt_passlist(): return ppipe.PassList([ p.LowerAggregateInstrs, p.SILCombine, p.SROA, p.Mem2Reg, p.DCE, p.SILCombine, simplifycfg_silcombine_passlist(), p.LoopRotate, p.DCE, p.CSE, p.SILCombine, p.SimplifyCFG, p.ABCOpt, p.DCE, p.COWArrayOpts, p.DCE, p.SwiftArrayOpts, ]) def lowlevel_loopopt_passlist(): return ppipe.PassList([ p.LICM, p.DCE, p.CSE, p.SILCombine, p.SimplifyCFG, ]) def inliner_for_optlevel(optlevel): if optlevel == 'high': return p.EarlyInliner elif optlevel == 'mid': return p.PerfInliner elif optlevel == 'low': return p.LateInliner else: raise RuntimeError('Unknown opt level') def ssapass_passlist(optlevel): return ppipe.PassList([ simplifycfg_silcombine_passlist(), p.AllocBoxToStack, p.CopyForwarding, p.LowerAggregateInstrs, p.SILCombine, p.SROA, p.Mem2Reg, p.PerformanceConstantPropagation, p.DCE, p.CSE, p.SILCombine, simplifycfg_silcombine_passlist(), p.GlobalLoadStoreOpts, # Need to add proper argument here p.CodeMotion, p.GlobalARCOpts, p.SpeculativeDevirtualizer, p.SILLinker, inliner_for_optlevel(optlevel), p.SimplifyCFG, p.CodeMotion, p.GlobalARCOpts, ]) def lower_passlist(): return ppipe.PassList([ p.DeadFunctionElimination, p.DeadObjectElimination, p.GlobalOpt, p.CapturePropagation, p.ClosureSpecializer, p.SpeculativeDevirtualizer, p.FunctionSignatureOpts, ]) def normal_passpipelines(): result = [] x = ppipe.PassPipeline('HighLevel', {'name': 'run_n_times', 'count': 2}) x.add_pass(ssapass_passlist('high')) result.append(x) x = ppipe.PassPipeline('EarlyLoopOpt', {'name': 'run_n_times', 'count': 1}) x.add_pass(highlevel_loopopt_passlist()) result.append(x) x = ppipe.PassPipeline('MidLevelOpt', {'name': 'run_n_times', 'count': 2}) x.add_pass(ssapass_passlist('mid')) result.append(x) x = ppipe.PassPipeline('Lower', {'name': 'run_to_fixed_point'}) x.add_pass(lower_passlist()) result.append(x) x = ppipe.PassPipeline('LowLevel', {'name': 'run_n_times', 'count': 1}) x.add_pass(ssapass_passlist('low')) result.append(x) x = ppipe.PassPipeline('LateLoopOpt', {'name': 'run_n_times', 'count': 1}) x.add_pass([lowlevel_loopopt_passlist(), p.DeadFunctionElimination]) result.append(x) return result