src/cmd/compile/internal/ssa/poset.go | 3 +-- src/cmd/compile/internal/ssa/poset_test.go | 4 ++-- test/prove.go | 22 ++++++++++++++++++++++ diff --git a/src/cmd/compile/internal/ssa/poset.go b/src/cmd/compile/internal/ssa/poset.go index 071297f8fa2baee138b4c29124ce6b0ab8f5c6e7..cf966c924c5c28b06c0a2d45e607338510caad62 100644 --- a/src/cmd/compile/internal/ssa/poset.go +++ b/src/cmd/compile/internal/ssa/poset.go @@ -814,8 +814,7 @@ if !f1 || !f2 { return false } - return i1 == i2 || po.reaches(i1, i2, false) || - (po.reaches(i2, i1, false) && !po.reaches(i2, i1, true)) + return i1 == i2 || po.reaches(i1, i2, false) } // Equal reports whether n1==n2. It returns false either when it is diff --git a/src/cmd/compile/internal/ssa/poset_test.go b/src/cmd/compile/internal/ssa/poset_test.go index cb739d9a0cecd1a541f8256b4f94436a06d35812..92c818a601e6afbb2464614c76575b6855acc95f 100644 --- a/src/cmd/compile/internal/ssa/poset_test.go +++ b/src/cmd/compile/internal/ssa/poset_test.go @@ -186,7 +186,7 @@ {NonEqual_Fail, 4, 100}, {OrderedOrEqual, 4, 12}, {OrderedOrEqual_Fail, 12, 4}, {OrderedOrEqual, 4, 7}, - {OrderedOrEqual, 7, 4}, + {OrderedOrEqual_Fail, 7, 4}, // Dag #1: 1<4<=7<12 {Checkpoint, 0, 0}, @@ -450,7 +450,7 @@ {SetOrder, 30, 40}, {SetOrderOrEqual, 20, 100}, {SetOrder, 100, 110}, {OrderedOrEqual, 10, 30}, - {OrderedOrEqual, 30, 10}, + {OrderedOrEqual_Fail, 30, 10}, {Ordered_Fail, 10, 30}, {Ordered_Fail, 30, 10}, {Ordered, 10, 40}, diff --git a/test/prove.go b/test/prove.go index 6e92b9eec21a7ece724f5dc7ff56931b13014703..f6dd9f0955b952066c4704c1c2472de7c5e0a70d 100644 --- a/test/prove.go +++ b/test/prove.go @@ -853,6 +853,28 @@ } return x } +// Ensure that bounds checks with negative indexes are not incorrectly removed. +func negIndex() { + n := make([]int, 1) + for i := -1; i <= 0; i++ { // ERROR "Induction variable: limits \[-1,0\], increment 1$" + n[i] = 1 + } +} +func negIndex2(n int) { + a := make([]int, 5) + b := make([]int, 5) + c := make([]int, 5) + for i := -1; i <= 0; i-- { + b[i] = i + n++ + if n > 10 { + break + } + } + useSlice(a) + useSlice(c) +} + //go:noinline func useInt(a int) { }