compiler: eliminate created but never used maps
Этот коммит содержится в:
родитель
25e73a5439
коммит
52199f4a14
1 изменённых файлов: 39 добавлений и 0 удалений
|
@ -37,6 +37,7 @@ func (c *Compiler) Optimize(optLevel, sizeLevel int, inlinerThreshold uint) {
|
||||||
goPasses.Run(c.mod)
|
goPasses.Run(c.mod)
|
||||||
|
|
||||||
// Run Go-specific optimization passes.
|
// Run Go-specific optimization passes.
|
||||||
|
c.OptimizeMaps()
|
||||||
c.OptimizeStringToBytes()
|
c.OptimizeStringToBytes()
|
||||||
c.OptimizeAllocs()
|
c.OptimizeAllocs()
|
||||||
c.Verify()
|
c.Verify()
|
||||||
|
@ -49,6 +50,44 @@ func (c *Compiler) Optimize(optLevel, sizeLevel int, inlinerThreshold uint) {
|
||||||
modPasses.Run(c.mod)
|
modPasses.Run(c.mod)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Eliminate created but not used maps.
|
||||||
|
//
|
||||||
|
// In the future, this should statically allocate created but never modified
|
||||||
|
// maps. This has not yet been implemented, however.
|
||||||
|
func (c *Compiler) OptimizeMaps() {
|
||||||
|
hashmapMake := c.mod.NamedFunction("runtime.hashmapMake")
|
||||||
|
if hashmapMake.IsNil() {
|
||||||
|
// nothing to optimize
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
hashmapBinarySet := c.mod.NamedFunction("runtime.hashmapBinarySet")
|
||||||
|
hashmapStringSet := c.mod.NamedFunction("runtime.hashmapStringSet")
|
||||||
|
|
||||||
|
for _, makeInst := range getUses(hashmapMake) {
|
||||||
|
updateInsts := []llvm.Value{}
|
||||||
|
unknownUses := false // are there any uses other than setting a value?
|
||||||
|
|
||||||
|
for _, use := range getUses(makeInst) {
|
||||||
|
switch use.CalledValue() {
|
||||||
|
case hashmapBinarySet, hashmapStringSet:
|
||||||
|
updateInsts = append(updateInsts, use)
|
||||||
|
default:
|
||||||
|
unknownUses = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !unknownUses {
|
||||||
|
// This map can be entirely removed, as it is only created but never
|
||||||
|
// used.
|
||||||
|
for _, inst := range updateInsts {
|
||||||
|
inst.EraseFromParentAsInstruction()
|
||||||
|
}
|
||||||
|
makeInst.EraseFromParentAsInstruction()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Transform runtime.stringToBytes(...) calls into const []byte slices whenever
|
// Transform runtime.stringToBytes(...) calls into const []byte slices whenever
|
||||||
// possible. This optimizes the following pattern:
|
// possible. This optimizes the following pattern:
|
||||||
// w.Write([]byte("foo"))
|
// w.Write([]byte("foo"))
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче