]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: minor comment improvements/corrections
authorAustin Clements <austin@google.com>
Tue, 9 Jan 2018 19:40:54 +0000 (14:40 -0500)
committerAustin Clements <austin@google.com>
Thu, 8 Mar 2018 22:25:21 +0000 (22:25 +0000)
Change-Id: Ie0934f1528d58d4971cdef726d3e2d23cf3935d3
Reviewed-on: https://go-review.googlesource.com/87475
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Alexandru Moșoi <alexandru@mosoi.ro>
src/cmd/compile/internal/ssa/func.go
src/cmd/compile/internal/ssa/prove.go

index 7e8f68bf87964a991d962583d24cd29e82eed9e5..3868ee37d995466b434bd5b83406ec19fdafe219 100644 (file)
@@ -28,7 +28,7 @@ type Func struct {
        Cache  *Cache      // re-usable cache
        fe     Frontend    // frontend state associated with this Func, callbacks into compiler frontend
        pass   *pass       // current pass information (name, options, etc.)
-       Name   string      // e.g. bytes·Compare
+       Name   string      // e.g. NewFunc or (*Func).NumBlocks (no package prefix)
        Type   *types.Type // type signature of the function.
        Blocks []*Block    // unordered set of all basic blocks (note: not indexable by ID)
        Entry  *Block      // the entry basic block
index a4473311ba7803862ea62846cc9d7d4871625190..ecf0412377979661a1340e77b3a9f736def73b73 100644 (file)
@@ -90,6 +90,12 @@ type limitFact struct {
 }
 
 // factsTable keeps track of relations between pairs of values.
+//
+// The fact table logic is sound, but incomplete. Outside of a few
+// special cases, it performs no deduction or arithmetic. While there
+// are known decision procedures for this, the ad hoc approach taken
+// by the facts table is effective for real code while remaining very
+// efficient.
 type factsTable struct {
        facts map[pair]relation // current known set of relation
        stack []fact            // previous sets of relations
@@ -433,8 +439,8 @@ var (
                // TODO: OpIsInBounds actually test 0 <= a < b. This means
                // that the positive branch learns signed/LT and unsigned/LT
                // but the negative branch only learns unsigned/GE.
-               OpIsInBounds:      {unsigned, lt},
-               OpIsSliceInBounds: {unsigned, lt | eq},
+               OpIsInBounds:      {unsigned, lt},      // 0 <= arg0 < arg1
+               OpIsSliceInBounds: {unsigned, lt | eq}, // 0 <= arg0 <= arg1
        }
 )
 
@@ -625,6 +631,7 @@ func updateRestrictions(parent *Block, ft *factsTable, t domain, v, w *Value, r
 // simplifyBlock simplifies block known the restrictions in ft.
 // Returns which branch must always be taken.
 func simplifyBlock(ft *factsTable, b *Block) branch {
+       // Replace OpSlicemask operations in b with constants where possible.
        for _, v := range b.Values {
                if v.Op != OpSlicemask {
                        continue