MCPcopy
hub / github.com/tinygo-org/tinygo / OptimizeMaps

Function OptimizeMaps

transform/maps.go:11–47  ·  view source on GitHub ↗

OptimizeMaps eliminates created but unused maps. In the future, this should statically allocate created but never modified maps. This has not yet been implemented, however.

(mod llvm.Module)

Source from the content-addressed store, hash-verified

9// In the future, this should statically allocate created but never modified
10// maps. This has not yet been implemented, however.
11func 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}

Callers 2

TestOptimizeMapsFunction · 0.92
OptimizePackageFunction · 0.85

Calls 2

getUsesFunction · 0.85
IsNilMethod · 0.80

Tested by 1

TestOptimizeMapsFunction · 0.74