mirror of
https://github.com/golang/go
synced 2024-09-28 19:14:29 -06:00
[release-branch.go1.12] cmd/compile: add necessary operand to mergePoint in rewrite rules
A missing operand to mergePoint caused lower to place values
in the wrong blocks.
Includes test, belt+suspenders to do both ssa check and verify
the output (was is how the bug was originally observed).
The fixed bug here is very likely present in Go versions
1.9-1.12 on amd64 and s390x
Updates #32680.
Fixes #32712.
Change-Id: I63e702c4c40602cb795ef71b1691eb704d38ccc7
Reviewed-on: https://go-review.googlesource.com/c/go/+/183059
Run-TryBot: David Chase <drchase@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
(cherry picked from commit 769fda2d51
)
Reviewed-on: https://go-review.googlesource.com/c/go/+/183241
This commit is contained in:
parent
c955c54431
commit
4dbe72de5f
@ -1597,13 +1597,13 @@
|
|||||||
&& s0.Uses == 1
|
&& s0.Uses == 1
|
||||||
&& s1.Uses == 1
|
&& s1.Uses == 1
|
||||||
&& or.Uses == 1
|
&& or.Uses == 1
|
||||||
&& mergePoint(b,x0,x1) != nil
|
&& mergePoint(b,x0,x1,y) != nil
|
||||||
&& clobber(x0)
|
&& clobber(x0)
|
||||||
&& clobber(x1)
|
&& clobber(x1)
|
||||||
&& clobber(s0)
|
&& clobber(s0)
|
||||||
&& clobber(s1)
|
&& clobber(s1)
|
||||||
&& clobber(or)
|
&& clobber(or)
|
||||||
-> @mergePoint(b,x0,x1) (ORL <v.Type> (SHLLconst <v.Type> [j0] (MOVWload [i0] {s} p mem)) y)
|
-> @mergePoint(b,x0,x1,y) (ORL <v.Type> (SHLLconst <v.Type> [j0] (MOVWload [i0] {s} p mem)) y)
|
||||||
|
|
||||||
(ORQ
|
(ORQ
|
||||||
s1:(SHLQconst [j1] x1:(MOVBload [i1] {s} p mem))
|
s1:(SHLQconst [j1] x1:(MOVBload [i1] {s} p mem))
|
||||||
@ -1618,13 +1618,13 @@
|
|||||||
&& s0.Uses == 1
|
&& s0.Uses == 1
|
||||||
&& s1.Uses == 1
|
&& s1.Uses == 1
|
||||||
&& or.Uses == 1
|
&& or.Uses == 1
|
||||||
&& mergePoint(b,x0,x1) != nil
|
&& mergePoint(b,x0,x1,y) != nil
|
||||||
&& clobber(x0)
|
&& clobber(x0)
|
||||||
&& clobber(x1)
|
&& clobber(x1)
|
||||||
&& clobber(s0)
|
&& clobber(s0)
|
||||||
&& clobber(s1)
|
&& clobber(s1)
|
||||||
&& clobber(or)
|
&& clobber(or)
|
||||||
-> @mergePoint(b,x0,x1) (ORQ <v.Type> (SHLQconst <v.Type> [j0] (MOVWload [i0] {s} p mem)) y)
|
-> @mergePoint(b,x0,x1,y) (ORQ <v.Type> (SHLQconst <v.Type> [j0] (MOVWload [i0] {s} p mem)) y)
|
||||||
|
|
||||||
(ORQ
|
(ORQ
|
||||||
s1:(SHLQconst [j1] x1:(MOVWload [i1] {s} p mem))
|
s1:(SHLQconst [j1] x1:(MOVWload [i1] {s} p mem))
|
||||||
@ -1639,13 +1639,13 @@
|
|||||||
&& s0.Uses == 1
|
&& s0.Uses == 1
|
||||||
&& s1.Uses == 1
|
&& s1.Uses == 1
|
||||||
&& or.Uses == 1
|
&& or.Uses == 1
|
||||||
&& mergePoint(b,x0,x1) != nil
|
&& mergePoint(b,x0,x1,y) != nil
|
||||||
&& clobber(x0)
|
&& clobber(x0)
|
||||||
&& clobber(x1)
|
&& clobber(x1)
|
||||||
&& clobber(s0)
|
&& clobber(s0)
|
||||||
&& clobber(s1)
|
&& clobber(s1)
|
||||||
&& clobber(or)
|
&& clobber(or)
|
||||||
-> @mergePoint(b,x0,x1) (ORQ <v.Type> (SHLQconst <v.Type> [j0] (MOVLload [i0] {s} p mem)) y)
|
-> @mergePoint(b,x0,x1,y) (ORQ <v.Type> (SHLQconst <v.Type> [j0] (MOVLload [i0] {s} p mem)) y)
|
||||||
|
|
||||||
// Little-endian indexed loads
|
// Little-endian indexed loads
|
||||||
|
|
||||||
@ -1722,13 +1722,13 @@
|
|||||||
&& s0.Uses == 1
|
&& s0.Uses == 1
|
||||||
&& s1.Uses == 1
|
&& s1.Uses == 1
|
||||||
&& or.Uses == 1
|
&& or.Uses == 1
|
||||||
&& mergePoint(b,x0,x1) != nil
|
&& mergePoint(b,x0,x1,y) != nil
|
||||||
&& clobber(x0)
|
&& clobber(x0)
|
||||||
&& clobber(x1)
|
&& clobber(x1)
|
||||||
&& clobber(s0)
|
&& clobber(s0)
|
||||||
&& clobber(s1)
|
&& clobber(s1)
|
||||||
&& clobber(or)
|
&& clobber(or)
|
||||||
-> @mergePoint(b,x0,x1) (ORL <v.Type> (SHLLconst <v.Type> [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y)
|
-> @mergePoint(b,x0,x1,y) (ORL <v.Type> (SHLLconst <v.Type> [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y)
|
||||||
|
|
||||||
(ORQ
|
(ORQ
|
||||||
s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem))
|
s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem))
|
||||||
@ -1743,13 +1743,13 @@
|
|||||||
&& s0.Uses == 1
|
&& s0.Uses == 1
|
||||||
&& s1.Uses == 1
|
&& s1.Uses == 1
|
||||||
&& or.Uses == 1
|
&& or.Uses == 1
|
||||||
&& mergePoint(b,x0,x1) != nil
|
&& mergePoint(b,x0,x1,y) != nil
|
||||||
&& clobber(x0)
|
&& clobber(x0)
|
||||||
&& clobber(x1)
|
&& clobber(x1)
|
||||||
&& clobber(s0)
|
&& clobber(s0)
|
||||||
&& clobber(s1)
|
&& clobber(s1)
|
||||||
&& clobber(or)
|
&& clobber(or)
|
||||||
-> @mergePoint(b,x0,x1) (ORQ <v.Type> (SHLQconst <v.Type> [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y)
|
-> @mergePoint(b,x0,x1,y) (ORQ <v.Type> (SHLQconst <v.Type> [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y)
|
||||||
|
|
||||||
(ORQ
|
(ORQ
|
||||||
s1:(SHLQconst [j1] x1:(MOVWloadidx1 [i1] {s} p idx mem))
|
s1:(SHLQconst [j1] x1:(MOVWloadidx1 [i1] {s} p idx mem))
|
||||||
@ -1764,13 +1764,13 @@
|
|||||||
&& s0.Uses == 1
|
&& s0.Uses == 1
|
||||||
&& s1.Uses == 1
|
&& s1.Uses == 1
|
||||||
&& or.Uses == 1
|
&& or.Uses == 1
|
||||||
&& mergePoint(b,x0,x1) != nil
|
&& mergePoint(b,x0,x1,y) != nil
|
||||||
&& clobber(x0)
|
&& clobber(x0)
|
||||||
&& clobber(x1)
|
&& clobber(x1)
|
||||||
&& clobber(s0)
|
&& clobber(s0)
|
||||||
&& clobber(s1)
|
&& clobber(s1)
|
||||||
&& clobber(or)
|
&& clobber(or)
|
||||||
-> @mergePoint(b,x0,x1) (ORQ <v.Type> (SHLQconst <v.Type> [j0] (MOVLloadidx1 [i0] {s} p idx mem)) y)
|
-> @mergePoint(b,x0,x1,y) (ORQ <v.Type> (SHLQconst <v.Type> [j0] (MOVLloadidx1 [i0] {s} p idx mem)) y)
|
||||||
|
|
||||||
// Big-endian loads
|
// Big-endian loads
|
||||||
|
|
||||||
@ -1864,13 +1864,13 @@
|
|||||||
&& s0.Uses == 1
|
&& s0.Uses == 1
|
||||||
&& s1.Uses == 1
|
&& s1.Uses == 1
|
||||||
&& or.Uses == 1
|
&& or.Uses == 1
|
||||||
&& mergePoint(b,x0,x1) != nil
|
&& mergePoint(b,x0,x1,y) != nil
|
||||||
&& clobber(x0)
|
&& clobber(x0)
|
||||||
&& clobber(x1)
|
&& clobber(x1)
|
||||||
&& clobber(s0)
|
&& clobber(s0)
|
||||||
&& clobber(s1)
|
&& clobber(s1)
|
||||||
&& clobber(or)
|
&& clobber(or)
|
||||||
-> @mergePoint(b,x0,x1) (ORL <v.Type> (SHLLconst <v.Type> [j1] (ROLWconst <typ.UInt16> [8] (MOVWload [i0] {s} p mem))) y)
|
-> @mergePoint(b,x0,x1,y) (ORL <v.Type> (SHLLconst <v.Type> [j1] (ROLWconst <typ.UInt16> [8] (MOVWload [i0] {s} p mem))) y)
|
||||||
|
|
||||||
(ORQ
|
(ORQ
|
||||||
s0:(SHLQconst [j0] x0:(MOVBload [i0] {s} p mem))
|
s0:(SHLQconst [j0] x0:(MOVBload [i0] {s} p mem))
|
||||||
@ -1885,13 +1885,13 @@
|
|||||||
&& s0.Uses == 1
|
&& s0.Uses == 1
|
||||||
&& s1.Uses == 1
|
&& s1.Uses == 1
|
||||||
&& or.Uses == 1
|
&& or.Uses == 1
|
||||||
&& mergePoint(b,x0,x1) != nil
|
&& mergePoint(b,x0,x1,y) != nil
|
||||||
&& clobber(x0)
|
&& clobber(x0)
|
||||||
&& clobber(x1)
|
&& clobber(x1)
|
||||||
&& clobber(s0)
|
&& clobber(s0)
|
||||||
&& clobber(s1)
|
&& clobber(s1)
|
||||||
&& clobber(or)
|
&& clobber(or)
|
||||||
-> @mergePoint(b,x0,x1) (ORQ <v.Type> (SHLQconst <v.Type> [j1] (ROLWconst <typ.UInt16> [8] (MOVWload [i0] {s} p mem))) y)
|
-> @mergePoint(b,x0,x1,y) (ORQ <v.Type> (SHLQconst <v.Type> [j1] (ROLWconst <typ.UInt16> [8] (MOVWload [i0] {s} p mem))) y)
|
||||||
|
|
||||||
(ORQ
|
(ORQ
|
||||||
s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWload [i0] {s} p mem)))
|
s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWload [i0] {s} p mem)))
|
||||||
@ -1908,7 +1908,7 @@
|
|||||||
&& s0.Uses == 1
|
&& s0.Uses == 1
|
||||||
&& s1.Uses == 1
|
&& s1.Uses == 1
|
||||||
&& or.Uses == 1
|
&& or.Uses == 1
|
||||||
&& mergePoint(b,x0,x1) != nil
|
&& mergePoint(b,x0,x1,y) != nil
|
||||||
&& clobber(x0)
|
&& clobber(x0)
|
||||||
&& clobber(x1)
|
&& clobber(x1)
|
||||||
&& clobber(r0)
|
&& clobber(r0)
|
||||||
@ -1916,7 +1916,7 @@
|
|||||||
&& clobber(s0)
|
&& clobber(s0)
|
||||||
&& clobber(s1)
|
&& clobber(s1)
|
||||||
&& clobber(or)
|
&& clobber(or)
|
||||||
-> @mergePoint(b,x0,x1) (ORQ <v.Type> (SHLQconst <v.Type> [j1] (BSWAPL <typ.UInt32> (MOVLload [i0] {s} p mem))) y)
|
-> @mergePoint(b,x0,x1,y) (ORQ <v.Type> (SHLQconst <v.Type> [j1] (BSWAPL <typ.UInt32> (MOVLload [i0] {s} p mem))) y)
|
||||||
|
|
||||||
// Big-endian indexed loads
|
// Big-endian indexed loads
|
||||||
|
|
||||||
@ -2010,13 +2010,13 @@
|
|||||||
&& s0.Uses == 1
|
&& s0.Uses == 1
|
||||||
&& s1.Uses == 1
|
&& s1.Uses == 1
|
||||||
&& or.Uses == 1
|
&& or.Uses == 1
|
||||||
&& mergePoint(b,x0,x1) != nil
|
&& mergePoint(b,x0,x1,y) != nil
|
||||||
&& clobber(x0)
|
&& clobber(x0)
|
||||||
&& clobber(x1)
|
&& clobber(x1)
|
||||||
&& clobber(s0)
|
&& clobber(s0)
|
||||||
&& clobber(s1)
|
&& clobber(s1)
|
||||||
&& clobber(or)
|
&& clobber(or)
|
||||||
-> @mergePoint(b,x0,x1) (ORL <v.Type> (SHLLconst <v.Type> [j1] (ROLWconst <typ.UInt16> [8] (MOVWloadidx1 [i0] {s} p idx mem))) y)
|
-> @mergePoint(b,x0,x1,y) (ORL <v.Type> (SHLLconst <v.Type> [j1] (ROLWconst <typ.UInt16> [8] (MOVWloadidx1 [i0] {s} p idx mem))) y)
|
||||||
|
|
||||||
(ORQ
|
(ORQ
|
||||||
s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem))
|
s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem))
|
||||||
@ -2031,13 +2031,13 @@
|
|||||||
&& s0.Uses == 1
|
&& s0.Uses == 1
|
||||||
&& s1.Uses == 1
|
&& s1.Uses == 1
|
||||||
&& or.Uses == 1
|
&& or.Uses == 1
|
||||||
&& mergePoint(b,x0,x1) != nil
|
&& mergePoint(b,x0,x1,y) != nil
|
||||||
&& clobber(x0)
|
&& clobber(x0)
|
||||||
&& clobber(x1)
|
&& clobber(x1)
|
||||||
&& clobber(s0)
|
&& clobber(s0)
|
||||||
&& clobber(s1)
|
&& clobber(s1)
|
||||||
&& clobber(or)
|
&& clobber(or)
|
||||||
-> @mergePoint(b,x0,x1) (ORQ <v.Type> (SHLQconst <v.Type> [j1] (ROLWconst <typ.UInt16> [8] (MOVWloadidx1 [i0] {s} p idx mem))) y)
|
-> @mergePoint(b,x0,x1,y) (ORQ <v.Type> (SHLQconst <v.Type> [j1] (ROLWconst <typ.UInt16> [8] (MOVWloadidx1 [i0] {s} p idx mem))) y)
|
||||||
|
|
||||||
(ORQ
|
(ORQ
|
||||||
s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} p idx mem)))
|
s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} p idx mem)))
|
||||||
@ -2054,7 +2054,7 @@
|
|||||||
&& s0.Uses == 1
|
&& s0.Uses == 1
|
||||||
&& s1.Uses == 1
|
&& s1.Uses == 1
|
||||||
&& or.Uses == 1
|
&& or.Uses == 1
|
||||||
&& mergePoint(b,x0,x1) != nil
|
&& mergePoint(b,x0,x1,y) != nil
|
||||||
&& clobber(x0)
|
&& clobber(x0)
|
||||||
&& clobber(x1)
|
&& clobber(x1)
|
||||||
&& clobber(r0)
|
&& clobber(r0)
|
||||||
@ -2062,7 +2062,7 @@
|
|||||||
&& clobber(s0)
|
&& clobber(s0)
|
||||||
&& clobber(s1)
|
&& clobber(s1)
|
||||||
&& clobber(or)
|
&& clobber(or)
|
||||||
-> @mergePoint(b,x0,x1) (ORQ <v.Type> (SHLQconst <v.Type> [j1] (BSWAPL <typ.UInt32> (MOVLloadidx1 [i0] {s} p idx mem))) y)
|
-> @mergePoint(b,x0,x1,y) (ORQ <v.Type> (SHLQconst <v.Type> [j1] (BSWAPL <typ.UInt32> (MOVLloadidx1 [i0] {s} p idx mem))) y)
|
||||||
|
|
||||||
// Combine 2 byte stores + shift into rolw 8 + word store
|
// Combine 2 byte stores + shift into rolw 8 + word store
|
||||||
(MOVBstore [i] {s} p w
|
(MOVBstore [i] {s} p w
|
||||||
|
@ -1480,13 +1480,13 @@
|
|||||||
&& s0.Uses == 1
|
&& s0.Uses == 1
|
||||||
&& s1.Uses == 1
|
&& s1.Uses == 1
|
||||||
&& or.Uses == 1
|
&& or.Uses == 1
|
||||||
&& mergePoint(b,x0,x1) != nil
|
&& mergePoint(b,x0,x1,y) != nil
|
||||||
&& clobber(x0)
|
&& clobber(x0)
|
||||||
&& clobber(x1)
|
&& clobber(x1)
|
||||||
&& clobber(s0)
|
&& clobber(s0)
|
||||||
&& clobber(s1)
|
&& clobber(s1)
|
||||||
&& clobber(or)
|
&& clobber(or)
|
||||||
-> @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y)
|
-> @mergePoint(b,x0,x1,y) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y)
|
||||||
|
|
||||||
(OR
|
(OR
|
||||||
s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))
|
s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))
|
||||||
@ -1501,13 +1501,13 @@
|
|||||||
&& s0.Uses == 1
|
&& s0.Uses == 1
|
||||||
&& s1.Uses == 1
|
&& s1.Uses == 1
|
||||||
&& or.Uses == 1
|
&& or.Uses == 1
|
||||||
&& mergePoint(b,x0,x1) != nil
|
&& mergePoint(b,x0,x1,y) != nil
|
||||||
&& clobber(x0)
|
&& clobber(x0)
|
||||||
&& clobber(x1)
|
&& clobber(x1)
|
||||||
&& clobber(s0)
|
&& clobber(s0)
|
||||||
&& clobber(s1)
|
&& clobber(s1)
|
||||||
&& clobber(or)
|
&& clobber(or)
|
||||||
-> @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y)
|
-> @mergePoint(b,x0,x1,y) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y)
|
||||||
|
|
||||||
(OR
|
(OR
|
||||||
s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem))
|
s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem))
|
||||||
@ -1522,13 +1522,13 @@
|
|||||||
&& s0.Uses == 1
|
&& s0.Uses == 1
|
||||||
&& s1.Uses == 1
|
&& s1.Uses == 1
|
||||||
&& or.Uses == 1
|
&& or.Uses == 1
|
||||||
&& mergePoint(b,x0,x1) != nil
|
&& mergePoint(b,x0,x1,y) != nil
|
||||||
&& clobber(x0)
|
&& clobber(x0)
|
||||||
&& clobber(x1)
|
&& clobber(x1)
|
||||||
&& clobber(s0)
|
&& clobber(s0)
|
||||||
&& clobber(s1)
|
&& clobber(s1)
|
||||||
&& clobber(or)
|
&& clobber(or)
|
||||||
-> @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y)
|
-> @mergePoint(b,x0,x1,y) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y)
|
||||||
|
|
||||||
// Big-endian indexed loads
|
// Big-endian indexed loads
|
||||||
|
|
||||||
@ -1610,13 +1610,13 @@
|
|||||||
&& s0.Uses == 1
|
&& s0.Uses == 1
|
||||||
&& s1.Uses == 1
|
&& s1.Uses == 1
|
||||||
&& or.Uses == 1
|
&& or.Uses == 1
|
||||||
&& mergePoint(b,x0,x1) != nil
|
&& mergePoint(b,x0,x1,y) != nil
|
||||||
&& clobber(x0)
|
&& clobber(x0)
|
||||||
&& clobber(x1)
|
&& clobber(x1)
|
||||||
&& clobber(s0)
|
&& clobber(s0)
|
||||||
&& clobber(s1)
|
&& clobber(s1)
|
||||||
&& clobber(or)
|
&& clobber(or)
|
||||||
-> @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
|
-> @mergePoint(b,x0,x1,y) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
|
||||||
|
|
||||||
(OR
|
(OR
|
||||||
s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))
|
s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))
|
||||||
@ -1631,13 +1631,13 @@
|
|||||||
&& s0.Uses == 1
|
&& s0.Uses == 1
|
||||||
&& s1.Uses == 1
|
&& s1.Uses == 1
|
||||||
&& or.Uses == 1
|
&& or.Uses == 1
|
||||||
&& mergePoint(b,x0,x1) != nil
|
&& mergePoint(b,x0,x1,y) != nil
|
||||||
&& clobber(x0)
|
&& clobber(x0)
|
||||||
&& clobber(x1)
|
&& clobber(x1)
|
||||||
&& clobber(s0)
|
&& clobber(s0)
|
||||||
&& clobber(s1)
|
&& clobber(s1)
|
||||||
&& clobber(or)
|
&& clobber(or)
|
||||||
-> @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
|
-> @mergePoint(b,x0,x1,y) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
|
||||||
|
|
||||||
(OR
|
(OR
|
||||||
s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem))
|
s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem))
|
||||||
@ -1652,13 +1652,13 @@
|
|||||||
&& s0.Uses == 1
|
&& s0.Uses == 1
|
||||||
&& s1.Uses == 1
|
&& s1.Uses == 1
|
||||||
&& or.Uses == 1
|
&& or.Uses == 1
|
||||||
&& mergePoint(b,x0,x1) != nil
|
&& mergePoint(b,x0,x1,y) != nil
|
||||||
&& clobber(x0)
|
&& clobber(x0)
|
||||||
&& clobber(x1)
|
&& clobber(x1)
|
||||||
&& clobber(s0)
|
&& clobber(s0)
|
||||||
&& clobber(s1)
|
&& clobber(s1)
|
||||||
&& clobber(or)
|
&& clobber(or)
|
||||||
-> @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y)
|
-> @mergePoint(b,x0,x1,y) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y)
|
||||||
|
|
||||||
// Little-endian loads
|
// Little-endian loads
|
||||||
|
|
||||||
@ -1750,13 +1750,13 @@
|
|||||||
&& s0.Uses == 1
|
&& s0.Uses == 1
|
||||||
&& s1.Uses == 1
|
&& s1.Uses == 1
|
||||||
&& or.Uses == 1
|
&& or.Uses == 1
|
||||||
&& mergePoint(b,x0,x1) != nil
|
&& mergePoint(b,x0,x1,y) != nil
|
||||||
&& clobber(x0)
|
&& clobber(x0)
|
||||||
&& clobber(x1)
|
&& clobber(x1)
|
||||||
&& clobber(s0)
|
&& clobber(s0)
|
||||||
&& clobber(s1)
|
&& clobber(s1)
|
||||||
&& clobber(or)
|
&& clobber(or)
|
||||||
-> @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y)
|
-> @mergePoint(b,x0,x1,y) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y)
|
||||||
|
|
||||||
(OR
|
(OR
|
||||||
s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))
|
s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))
|
||||||
@ -1772,13 +1772,13 @@
|
|||||||
&& s0.Uses == 1
|
&& s0.Uses == 1
|
||||||
&& s1.Uses == 1
|
&& s1.Uses == 1
|
||||||
&& or.Uses == 1
|
&& or.Uses == 1
|
||||||
&& mergePoint(b,x0,x1) != nil
|
&& mergePoint(b,x0,x1,y) != nil
|
||||||
&& clobber(x0)
|
&& clobber(x0)
|
||||||
&& clobber(x1)
|
&& clobber(x1)
|
||||||
&& clobber(s0)
|
&& clobber(s0)
|
||||||
&& clobber(s1)
|
&& clobber(s1)
|
||||||
&& clobber(or)
|
&& clobber(or)
|
||||||
-> @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y)
|
-> @mergePoint(b,x0,x1,y) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y)
|
||||||
|
|
||||||
(OR
|
(OR
|
||||||
s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem)))
|
s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem)))
|
||||||
@ -1795,7 +1795,7 @@
|
|||||||
&& s0.Uses == 1
|
&& s0.Uses == 1
|
||||||
&& s1.Uses == 1
|
&& s1.Uses == 1
|
||||||
&& or.Uses == 1
|
&& or.Uses == 1
|
||||||
&& mergePoint(b,x0,x1) != nil
|
&& mergePoint(b,x0,x1,y) != nil
|
||||||
&& clobber(x0)
|
&& clobber(x0)
|
||||||
&& clobber(x1)
|
&& clobber(x1)
|
||||||
&& clobber(r0)
|
&& clobber(r0)
|
||||||
@ -1803,7 +1803,7 @@
|
|||||||
&& clobber(s0)
|
&& clobber(s0)
|
||||||
&& clobber(s1)
|
&& clobber(s1)
|
||||||
&& clobber(or)
|
&& clobber(or)
|
||||||
-> @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y)
|
-> @mergePoint(b,x0,x1,y) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y)
|
||||||
|
|
||||||
// Little-endian indexed loads
|
// Little-endian indexed loads
|
||||||
|
|
||||||
@ -1895,13 +1895,13 @@
|
|||||||
&& s0.Uses == 1
|
&& s0.Uses == 1
|
||||||
&& s1.Uses == 1
|
&& s1.Uses == 1
|
||||||
&& or.Uses == 1
|
&& or.Uses == 1
|
||||||
&& mergePoint(b,x0,x1) != nil
|
&& mergePoint(b,x0,x1,y) != nil
|
||||||
&& clobber(x0)
|
&& clobber(x0)
|
||||||
&& clobber(x1)
|
&& clobber(x1)
|
||||||
&& clobber(s0)
|
&& clobber(s0)
|
||||||
&& clobber(s1)
|
&& clobber(s1)
|
||||||
&& clobber(or)
|
&& clobber(or)
|
||||||
-> @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
|
-> @mergePoint(b,x0,x1,y) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
|
||||||
|
|
||||||
(OR
|
(OR
|
||||||
s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))
|
s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))
|
||||||
@ -1917,13 +1917,13 @@
|
|||||||
&& s0.Uses == 1
|
&& s0.Uses == 1
|
||||||
&& s1.Uses == 1
|
&& s1.Uses == 1
|
||||||
&& or.Uses == 1
|
&& or.Uses == 1
|
||||||
&& mergePoint(b,x0,x1) != nil
|
&& mergePoint(b,x0,x1,y) != nil
|
||||||
&& clobber(x0)
|
&& clobber(x0)
|
||||||
&& clobber(x1)
|
&& clobber(x1)
|
||||||
&& clobber(s0)
|
&& clobber(s0)
|
||||||
&& clobber(s1)
|
&& clobber(s1)
|
||||||
&& clobber(or)
|
&& clobber(or)
|
||||||
-> @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
|
-> @mergePoint(b,x0,x1,y) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
|
||||||
|
|
||||||
(OR
|
(OR
|
||||||
s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))
|
s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))
|
||||||
@ -1940,7 +1940,7 @@
|
|||||||
&& s0.Uses == 1
|
&& s0.Uses == 1
|
||||||
&& s1.Uses == 1
|
&& s1.Uses == 1
|
||||||
&& or.Uses == 1
|
&& or.Uses == 1
|
||||||
&& mergePoint(b,x0,x1) != nil
|
&& mergePoint(b,x0,x1,y) != nil
|
||||||
&& clobber(x0)
|
&& clobber(x0)
|
||||||
&& clobber(x1)
|
&& clobber(x1)
|
||||||
&& clobber(r0)
|
&& clobber(r0)
|
||||||
@ -1948,7 +1948,7 @@
|
|||||||
&& clobber(s0)
|
&& clobber(s0)
|
||||||
&& clobber(s1)
|
&& clobber(s1)
|
||||||
&& clobber(or)
|
&& clobber(or)
|
||||||
-> @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y)
|
-> @mergePoint(b,x0,x1,y) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y)
|
||||||
|
|
||||||
// Combine stores into store multiples.
|
// Combine stores into store multiples.
|
||||||
// 32-bit
|
// 32-bit
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
23
test/fixedbugs/issue32680.go
Normal file
23
test/fixedbugs/issue32680.go
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
// run -gcflags=-d=ssa/check/on
|
||||||
|
|
||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// As of 2019-06, bug affects/ed amd64 and s390x.
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
var foo = []byte{105, 57, 172, 152}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
for i := 0; i < len(foo); i += 4 {
|
||||||
|
// Requires inlining and non-constant i
|
||||||
|
// Note the bug/fix also apply to different widths, but was unable to reproduce for those.
|
||||||
|
println(readLittleEndian32_2(foo[i], foo[i+1], foo[i+2], foo[i+3]))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func readLittleEndian32_2(a, b, c, d byte) uint32 {
|
||||||
|
return uint32(a) | (uint32(b) << 8) | (uint32(c) << 16) | (uint32(d) << 24)
|
||||||
|
}
|
1
test/fixedbugs/issue32680.out
Normal file
1
test/fixedbugs/issue32680.out
Normal file
@ -0,0 +1 @@
|
|||||||
|
2561423721
|
Loading…
Reference in New Issue
Block a user