mirror of
https://github.com/golang/go
synced 2024-11-18 20:14:43 -07:00
5b55a71008
Motivation: simple constraints---copy and addr---are more amenable to pre-solver optimizations (forthcoming) than complex constraints: load, store, and all others. In code such as the following: t0 = new struct { x, y int } t1 = &t0.y t2 = *t1 there's no need for the full generality of a (complex) load constraint for t2=*t1 since t1 can only point to t0.y. All we need is a (simple) copy constraint t2 = (t0.y) where (t0.y) is the object node label for that field. For all "addressable" SSA instructions, we tabulate whether their points-to set is necessarily a singleton. For some (e.g. Alloc, MakeSlice, etc) this is always true by design. For others (e.g. FieldAddr) it depends on their operands. We exploit this information when generating constraints: all load-form and store-form constraints are reduced to copy constraints if the pointer's PTS is a singleton. Similarly all FieldAddr (y=&x.f) and IndexAddr (y=&x[0]) constraints are reduced to offset addition, for singleton operands. Here's the constraint mix when running on the oracle itself. The total number of constraints is unchanged but the fraction that are complex has gone down to 21% from 53%. before after --simple-- addr 20682 46949 copy 61454 91211 --complex-- offsetAddr 41621 15325 load 18769 12925 store 30758 6908 invoke 758 760 typeAssert 1688 1689 total 175832 175869 Also: - Add Pointer.Context() for local variables, since we now plumb cgnodes throughout. Nice. - Refactor all load-form (load, receive, lookup) and store-form (Store, send, MapUpdate) constraints to use genLoad and genStore. - Log counts of constraints by type. - valNodes split into localval and globalval maps; localval is purged after each function. - analogous maps localobj[v] and globalobj[v] hold sole label for pts(v), if singleton. - fnObj map subsumed by globalobj. - make{Function/Global/Constant} inlined into objectValue. Much cleaner. R=crawshaw CC=golang-dev https://golang.org/cl/13979043 |
||
---|---|---|
.. | ||
testdata | ||
analysis.go | ||
api.go | ||
callgraph.go | ||
doc.go | ||
example_test.go | ||
gen.go | ||
intrinsics.go | ||
labels.go | ||
pointer_test.go | ||
print.go | ||
reflect.go | ||
solve.go | ||
TODO | ||
util.go |