github.com/tinygo-org/tinygo@v0.31.3-0.20240404173401-90b0bf646c27/transform/maps.go (about) 1 package transform 2 3 import ( 4 "tinygo.org/x/go-llvm" 5 ) 6 7 // OptimizeMaps eliminates created but unused maps. 8 // 9 // In the future, this should statically allocate created but never modified 10 // maps. This has not yet been implemented, however. 11 func OptimizeMaps(mod llvm.Module) { 12 hashmapMake := mod.NamedFunction("runtime.hashmapMake") 13 if hashmapMake.IsNil() { 14 // nothing to optimize 15 return 16 } 17 18 hashmapBinarySet := mod.NamedFunction("runtime.hashmapBinarySet") 19 hashmapStringSet := mod.NamedFunction("runtime.hashmapStringSet") 20 21 for _, makeInst := range getUses(hashmapMake) { 22 updateInsts := []llvm.Value{} 23 unknownUses := false // are there any uses other than setting a value? 24 25 for _, use := range getUses(makeInst) { 26 if use := use.IsACallInst(); !use.IsNil() { 27 switch use.CalledValue() { 28 case hashmapBinarySet, hashmapStringSet: 29 updateInsts = append(updateInsts, use) 30 default: 31 unknownUses = true 32 } 33 } else { 34 unknownUses = true 35 } 36 } 37 38 if !unknownUses { 39 // This map can be entirely removed, as it is only created but never 40 // used. 41 for _, inst := range updateInsts { 42 inst.EraseFromParentAsInstruction() 43 } 44 makeInst.EraseFromParentAsInstruction() 45 } 46 } 47 }