From 5db43e8d04875015dc2147d67411a7079c1ff225 Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Sat, 6 Oct 2018 19:57:19 +0200 Subject: [PATCH] compiler: move Optimize() function to a separate file In the future, there will be more optimizations. Let's keep them in a separate file for separation of concerns. --- compiler/compiler.go | 27 --------------------------- compiler/optimizer.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 27 deletions(-) create mode 100644 compiler/optimizer.go diff --git a/compiler/compiler.go b/compiler/compiler.go index 31949f91..6794511a 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -3109,33 +3109,6 @@ func (c *Compiler) NonConstGlobals() { } } -func (c *Compiler) Optimize(optLevel, sizeLevel int, inlinerThreshold uint) { - builder := llvm.NewPassManagerBuilder() - defer builder.Dispose() - builder.SetOptLevel(optLevel) - builder.SetSizeLevel(sizeLevel) - if inlinerThreshold != 0 { - builder.UseInlinerWithThreshold(inlinerThreshold) - } - builder.AddCoroutinePassesToExtensionPoints() - - // Run function passes for each function. - funcPasses := llvm.NewFunctionPassManagerForModule(c.mod) - defer funcPasses.Dispose() - builder.PopulateFunc(funcPasses) - funcPasses.InitializeFunc() - for fn := c.mod.FirstFunction(); !fn.IsNil(); fn = llvm.NextFunction(fn) { - funcPasses.RunFunc(fn) - } - funcPasses.FinalizeFunc() - - // Run module passes. - modPasses := llvm.NewPassManager() - defer modPasses.Dispose() - builder.Populate(modPasses) - modPasses.Run(c.mod) -} - // Emit object file (.o). func (c *Compiler) EmitObject(path string) error { llvmBuf, err := c.machine.EmitToMemoryBuffer(c.mod, llvm.ObjectFile) diff --git a/compiler/optimizer.go b/compiler/optimizer.go new file mode 100644 index 00000000..d43064a1 --- /dev/null +++ b/compiler/optimizer.go @@ -0,0 +1,32 @@ +package compiler + +import ( + "github.com/aykevl/go-llvm" +) + +func (c *Compiler) Optimize(optLevel, sizeLevel int, inlinerThreshold uint) { + builder := llvm.NewPassManagerBuilder() + defer builder.Dispose() + builder.SetOptLevel(optLevel) + builder.SetSizeLevel(sizeLevel) + if inlinerThreshold != 0 { + builder.UseInlinerWithThreshold(inlinerThreshold) + } + builder.AddCoroutinePassesToExtensionPoints() + + // Run function passes for each function. + funcPasses := llvm.NewFunctionPassManagerForModule(c.mod) + defer funcPasses.Dispose() + builder.PopulateFunc(funcPasses) + funcPasses.InitializeFunc() + for fn := c.mod.FirstFunction(); !fn.IsNil(); fn = llvm.NextFunction(fn) { + funcPasses.RunFunc(fn) + } + funcPasses.FinalizeFunc() + + // Run module passes. + modPasses := llvm.NewPassManager() + defer modPasses.Dispose() + builder.Populate(modPasses) + modPasses.Run(c.mod) +}