]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: check indirect connection between if block and phi block in addLocalIndu...
authorCholerae Hu <choleraehyq@gmail.com>
Fri, 31 Jul 2020 05:57:48 +0000 (13:57 +0800)
committerDmitri Shuralyov <dmitshur@golang.org>
Sat, 7 Nov 2020 07:33:23 +0000 (07:33 +0000)
CL 244579 added guard clauses to prevent a faulty state that was
possible under the incorrect logic of the uniquePred loop in
addLocalInductiveFacts. That faulty state was still making the
intended optimization, but not for the correct reason.
Removing the faulty state also removed the overly permissive application
of the optimization, and therefore made these two tests fail.
We disabled the tests of this optimization in CL 244579 to allow us to
quickly apply the fix in the CL. This CL now corrects the logic of the
uniquePred loop in order to apply the optimization correctly.

The comment above the uniquePred loop says that it will follow unique
predecessors until it reaches a join point. Without updating the child
node on each iteration, it cannot follow the chain of unique
predecessors more than one step. Adding the update to the child node
on each iteration of the loop allows the logic to follow the chain of
unique predecessors until reaching a join point (because a non-unique
predecessor will signify a join point).

Updates #40502.

Change-Id: I23d8367046a2ab3ce4be969631f9ba15dc533e6c
Reviewed-on: https://go-review.googlesource.com/c/go/+/246157
Run-TryBot: Dmitri Shuralyov <dmitshur@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: David Chase <drchase@google.com>
Trust: Dmitri Shuralyov <dmitshur@golang.org>

src/cmd/compile/internal/ssa/prove.go
test/prove.go

index ce7d689f935a3c910f6fd6606c538e690e3c0185..8a2e7c09bc5a36c08122d21b8438a004e3c3f73b 100644 (file)
@@ -1082,7 +1082,7 @@ func addLocalInductiveFacts(ft *factsTable, b *Block) {
                        return nil
                }
                pred, child := b.Preds[1].b, b
-               for ; pred != nil; pred = uniquePred(pred) {
+               for ; pred != nil; pred, child = uniquePred(pred), pred {
                        if pred.Kind != BlockIf {
                                continue
                        }
index 3c19c513b65a61d2a69c4a3e14f7e600f6d82075..d37021d28305ae589156bbbaadbb39e5da32236a 100644 (file)
@@ -670,8 +670,7 @@ func oforuntil(b []int) {
        i := 0
        if len(b) > i {
        top:
-               // TODO: remove the todo of next line once we complete the following optimization of CL 244579
-               // println(b[i]) // todo: ERROR "Induction variable: limits \[0,\?\), increment 1$" "Proved IsInBounds$"
+               println(b[i]) // ERROR "Induction variable: limits \[0,\?\), increment 1$" "Proved IsInBounds$"
                i++
                if i < len(b) {
                        goto top
@@ -721,8 +720,7 @@ func range1(b []int) {
 // range2 elements are larger, so they use the general form of a range loop.
 func range2(b [][32]int) {
        for i, v := range b {
-               // TODO: remove the todo of next line once we complete the following optimization of CL 244579
-               b[i][0] = v[0] + 1 // todo: ERROR "Induction variable: limits \[0,\?\), increment 1$" "Proved IsInBounds$"
+               b[i][0] = v[0] + 1 // ERROR "Induction variable: limits \[0,\?\), increment 1$" "Proved IsInBounds$"
                if i < len(b) {    // ERROR "Proved Less64$"
                        println("x")
                }