Add python utilities for generating pipeline files.

Specifically the following utilities are provided:

1. Normal Pipeline.
2. Normal Pipeline with Specific Passes Disabled.
5. Normal Pipeline with specific PassLists disabled.

Swift SVN r24056
This commit is contained in:
Michael Gottesman
2014-12-20 04:09:48 +00:00
parent 1ae4002b6f
commit 4ef6edbda9
5 changed files with 386 additions and 0 deletions

View File

@@ -0,0 +1,138 @@
import pass_pipeline as ppipe
import passes
def diagnostic_passlist():
return ppipe.PassList([
passes.CapturePromotion,
passes.AllocBoxToStack,
passes.InOutDeshadowing,
passes.NoReturnFolding,
passes.DefiniteInitialization,
passes.PredictableMemoryOptimizations,
passes.DiagnosticConstantPropagation,
passes.DiagnoseUnreachable,
passes.EmitDFDiagnostics,
passes.SplitNonCondBrCriticalEdges,
])
def simplifycfg_silcombine_passlist():
return ppipe.PassList([
passes.SimplifyCFG,
passes.SILCombine,
passes.SimplifyCFG,
])
def highlevel_loopopt_passlist():
return ppipe.PassList([
passes.LowerAggregateInstrs,
passes.SILCombine,
passes.SROA,
passes.Mem2Reg,
passes.DCE,
passes.SILCombine,
simplifycfg_silcombine_passlist(),
passes.LoopRotate,
passes.DCE,
passes.CSE,
passes.SILCombine,
passes.SimplifyCFG,
passes.ABCOpt,
passes.DCE,
passes.COWArrayOpts,
passes.DCE,
passes.SwiftArrayOpts,
])
def lowlevel_loopopt_passlist():
return ppipe.PassList([
passes.LICM,
passes.DCE,
passes.CSE,
passes.SILCombine,
passes.SimplifyCFG,
])
def inliner_for_optlevel(optlevel):
if optlevel == 'high':
return passes.EarlyInliner
elif optlevel == 'mid':
return passes.PerfInliner
elif optlevel == 'low':
return passes.LateInliner
else:
raise RuntimeError('Unknown opt level')
def ssapass_passlist(optlevel):
return ppipe.PassList([
simplifycfg_silcombine_passlist(),
passes.AllocBoxToStack,
passes.CopyForwarding,
passes.LowerAggregateInstrs,
passes.SILCombine,
passes.SROA,
passes.Mem2Reg,
passes.PerformanceConstantPropagation,
passes.DCE,
passes.CSE,
passes.SILCombine,
simplifycfg_silcombine_passlist(),
passes.GlobalLoadStoreOpts,
passes.CodeMotion, # Need to add proper argument here
passes.GlobalARCOpts,
passes.Devirtualizer,
passes.GenericSpecializer,
passes.SILLinker,
inliner_for_optlevel(optlevel),
passes.SimplifyCFG,
passes.CodeMotion,
passes.GlobalARCOpts,
])
def lower_passlist():
return ppipe.PassList([
passes.DeadFunctionElimination,
passes.DeadObjectElimination,
passes.GlobalOpt,
passes.CapturePropagation,
passes.ClosureSpecializer,
passes.Devirtualizer,
passes.InlineCaches,
passes.FunctionSignatureOpts,
])
def specialization_passlist():
return ppipe.PassList([passes.SILLinker, passes.GenericSpecializer])
def normal_passpipelines():
result = []
x = ppipe.PassPipeline('PreSpecialize', {'name': 'run_to_fixed_point'})
x.addPass(specialization_passlist())
result.append(x)
x = ppipe.PassPipeline('HighLevel', {'name': 'run_n_times', 'count': 2})
x.addPass(ssapass_passlist('high'))
result.append(x)
x = ppipe.PassPipeline('EarlyLoopOpt', {'name' : 'run_n_times', 'count' : 1})
x.addPass(highlevel_loopopt_passlist())
result.append(x)
x = ppipe.PassPipeline('MidLevelOpt', {'name' : 'run_n_times', 'count' : 2})
x.addPass(ssapass_passlist('mid'))
result.append(x)
x = ppipe.PassPipeline('Lower', {'name' : 'run_to_fixed_point'})
x.addPass(lower_passlist())
result.append(x)
x = ppipe.PassPipeline('LowLevel', {'name' : 'run_n_times', 'count' : 1})
x.addPass(ssapass_passlist('low'))
result.append(x)
x = ppipe.PassPipeline('LateLoopOpt', {'name' : 'run_n_times', 'count' : 1})
x.addPass([lowlevel_loopopt_passlist(), passes.DeadFunctionElimination])
result.append(x)
return result