Commit 05962561 authored by Wei Xiao's avatar Wei Xiao Committed by Cherry Zhang

cmd/compile/internal/ssa: improve store combine optimization on arm64

Current implementation doesn't consider MOVDreg type operand and fail to combine
it into larger store. This patch fixes the issue.

Fixes #24242

Change-Id: I7d68697f80e76f48c3528ece01a602bf513248ec
Reviewed-on: https://go-review.googlesource.com/98397
Run-TryBot: Giovanni Bajo <rasky@develer.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: 's avatarCherry Zhang <cherryyz@google.com>
parent b8543397
...@@ -1520,6 +1520,11 @@ ...@@ -1520,6 +1520,11 @@
&& isSamePtr(ptr0, ptr1) && isSamePtr(ptr0, ptr1)
&& clobber(x) && clobber(x)
-> (MOVHstore [i-1] {s} ptr0 w mem) -> (MOVHstore [i-1] {s} ptr0 w mem)
(MOVBstore [i] {s} ptr0 (SRLconst [8] (MOVDreg w)) x:(MOVBstore [i-1] {s} ptr1 w mem))
&& x.Uses == 1
&& isSamePtr(ptr0, ptr1)
&& clobber(x)
-> (MOVHstore [i-1] {s} ptr0 w mem)
(MOVBstore [i] {s} ptr0 (SRLconst [j] w) x:(MOVBstore [i-1] {s} ptr1 w0:(SRLconst [j-8] w) mem)) (MOVBstore [i] {s} ptr0 (SRLconst [j] w) x:(MOVBstore [i-1] {s} ptr1 w0:(SRLconst [j-8] w) mem))
&& x.Uses == 1 && x.Uses == 1
&& isSamePtr(ptr0, ptr1) && isSamePtr(ptr0, ptr1)
...@@ -1530,6 +1535,11 @@ ...@@ -1530,6 +1535,11 @@
&& isSamePtr(ptr0, ptr1) && isSamePtr(ptr0, ptr1)
&& clobber(x) && clobber(x)
-> (MOVHstore [i-1] {s} ptr0 w0 mem) -> (MOVHstore [i-1] {s} ptr0 w0 mem)
(MOVBstore [i] {s} ptr0 (SRLconst [j] (MOVDreg w)) x:(MOVBstore [i-1] {s} ptr1 w0:(SRLconst [j-8] (MOVDreg w)) mem))
&& x.Uses == 1
&& isSamePtr(ptr0, ptr1)
&& clobber(x)
-> (MOVHstore [i-1] {s} ptr0 w0 mem)
(MOVHstore [i] {s} ptr0 (SRLconst [16] w) x:(MOVHstore [i-2] {s} ptr1 w mem)) (MOVHstore [i] {s} ptr0 (SRLconst [16] w) x:(MOVHstore [i-2] {s} ptr1 w mem))
&& x.Uses == 1 && x.Uses == 1
&& isSamePtr(ptr0, ptr1) && isSamePtr(ptr0, ptr1)
...@@ -1540,6 +1550,11 @@ ...@@ -1540,6 +1550,11 @@
&& isSamePtr(ptr0, ptr1) && isSamePtr(ptr0, ptr1)
&& clobber(x) && clobber(x)
-> (MOVWstore [i-2] {s} ptr0 w mem) -> (MOVWstore [i-2] {s} ptr0 w mem)
(MOVHstore [i] {s} ptr0 (SRLconst [16] (MOVDreg w)) x:(MOVHstore [i-2] {s} ptr1 w mem))
&& x.Uses == 1
&& isSamePtr(ptr0, ptr1)
&& clobber(x)
-> (MOVWstore [i-2] {s} ptr0 w mem)
(MOVHstore [i] {s} ptr0 (SRLconst [j] w) x:(MOVHstore [i-2] {s} ptr1 w0:(SRLconst [j-16] w) mem)) (MOVHstore [i] {s} ptr0 (SRLconst [j] w) x:(MOVHstore [i-2] {s} ptr1 w0:(SRLconst [j-16] w) mem))
&& x.Uses == 1 && x.Uses == 1
&& isSamePtr(ptr0, ptr1) && isSamePtr(ptr0, ptr1)
...@@ -1589,6 +1604,17 @@ ...@@ -1589,6 +1604,17 @@
&& clobber(x1) && clobber(x1)
&& clobber(x2) && clobber(x2)
-> (MOVWstore [i-3] {s} ptr (REVW <w.Type> w) mem) -> (MOVWstore [i-3] {s} ptr (REVW <w.Type> w) mem)
(MOVBstore [i] {s} ptr w
x0:(MOVBstore [i-1] {s} ptr (SRLconst [8] (MOVDreg w))
x1:(MOVBstore [i-2] {s} ptr (SRLconst [16] (MOVDreg w))
x2:(MOVBstore [i-3] {s} ptr (SRLconst [24] (MOVDreg w)) mem))))
&& x0.Uses == 1
&& x1.Uses == 1
&& x2.Uses == 1
&& clobber(x0)
&& clobber(x1)
&& clobber(x2)
-> (MOVWstore [i-3] {s} ptr (REVW <w.Type> w) mem)
(MOVBstore [i] {s} ptr w (MOVBstore [i] {s} ptr w
x0:(MOVBstore [i-1] {s} ptr (SRLconst [8] w) x0:(MOVBstore [i-1] {s} ptr (SRLconst [8] w)
x1:(MOVBstore [i-2] {s} ptr (SRLconst [16] w) x1:(MOVBstore [i-2] {s} ptr (SRLconst [16] w)
...@@ -1608,10 +1634,18 @@ ...@@ -1608,10 +1634,18 @@
&& x.Uses == 1 && x.Uses == 1
&& clobber(x) && clobber(x)
-> (MOVHstore [i-1] {s} ptr (REV16W <w.Type> w) mem) -> (MOVHstore [i-1] {s} ptr (REV16W <w.Type> w) mem)
(MOVBstore [i] {s} ptr w x:(MOVBstore [i-1] {s} ptr (SRLconst [8] (MOVDreg w)) mem))
&& x.Uses == 1
&& clobber(x)
-> (MOVHstore [i-1] {s} ptr (REV16W <w.Type> w) mem)
(MOVBstore [i] {s} ptr w x:(MOVBstore [i-1] {s} ptr (SRLconst [8] (MOVWUreg w)) mem)) (MOVBstore [i] {s} ptr w x:(MOVBstore [i-1] {s} ptr (SRLconst [8] (MOVWUreg w)) mem))
&& x.Uses == 1 && x.Uses == 1
&& clobber(x) && clobber(x)
-> (MOVHstore [i-1] {s} ptr (REV16W <w.Type> w) mem) -> (MOVHstore [i-1] {s} ptr (REV16W <w.Type> w) mem)
(MOVBstore [i] {s} ptr w x:(MOVBstore [i-1] {s} ptr (SRLconst [8] (MOVDreg w)) mem))
&& x.Uses == 1
&& clobber(x)
-> (MOVHstore [i-1] {s} ptr (REV16W <w.Type> w) mem)
// FP simplification // FP simplification
(FNEGS (FMULS x y)) -> (FNMULS x y) (FNEGS (FMULS x y)) -> (FNMULS x y)
......
...@@ -110,28 +110,28 @@ func store_le64_idx(b []byte, idx int) { ...@@ -110,28 +110,28 @@ func store_le64_idx(b []byte, idx int) {
func store_le32(b []byte) { func store_le32(b []byte) {
// amd64:`MOVL\s` // amd64:`MOVL\s`
// arm64(DISABLED):`MOVW`,-`MOV[BH]` // arm64:`MOVW`,-`MOV[BH]`
// ppc64le:`MOVW\s` // ppc64le:`MOVW\s`
binary.LittleEndian.PutUint32(b, sink32) binary.LittleEndian.PutUint32(b, sink32)
} }
func store_le32_idx(b []byte, idx int) { func store_le32_idx(b []byte, idx int) {
// amd64:`MOVL\s` // amd64:`MOVL\s`
// arm64(DISABLED):`MOVW`,-`MOV[BH]` // arm64:`MOVW`,-`MOV[BH]`
// ppc64le:`MOVW\s` // ppc64le:`MOVW\s`
binary.LittleEndian.PutUint32(b[idx:], sink32) binary.LittleEndian.PutUint32(b[idx:], sink32)
} }
func store_le16(b []byte) { func store_le16(b []byte) {
// amd64:`MOVW\s` // amd64:`MOVW\s`
// arm64(DISABLED):`MOVH`,-`MOVB` // arm64:`MOVH`,-`MOVB`
// ppc64le(DISABLED):`MOVH\s` // ppc64le(DISABLED):`MOVH\s`
binary.LittleEndian.PutUint16(b, sink16) binary.LittleEndian.PutUint16(b, sink16)
} }
func store_le16_idx(b []byte, idx int) { func store_le16_idx(b []byte, idx int) {
// amd64:`MOVW\s` // amd64:`MOVW\s`
// arm64(DISABLED):`MOVH`,-`MOVB` // arm64:`MOVH`,-`MOVB`
// ppc64le(DISABLED):`MOVH\s` // ppc64le(DISABLED):`MOVH\s`
binary.LittleEndian.PutUint16(b[idx:], sink16) binary.LittleEndian.PutUint16(b[idx:], sink16)
} }
...@@ -150,24 +150,24 @@ func store_be64_idx(b []byte, idx int) { ...@@ -150,24 +150,24 @@ func store_be64_idx(b []byte, idx int) {
func store_be32(b []byte) { func store_be32(b []byte) {
// amd64:`BSWAPL`,-`SHR.` // amd64:`BSWAPL`,-`SHR.`
// arm64(DISABLED):`MOVW`,`REVW`,-`MOV[BH]` // arm64:`MOVW`,`REVW`,-`MOV[BH]`
binary.BigEndian.PutUint32(b, sink32) binary.BigEndian.PutUint32(b, sink32)
} }
func store_be32_idx(b []byte, idx int) { func store_be32_idx(b []byte, idx int) {
// amd64:`BSWAPL`,-`SHR.` // amd64:`BSWAPL`,-`SHR.`
// arm64(DISABLED):`MOVW`,`REVW`,-`MOV[BH]` // arm64:`MOVW`,`REVW`,-`MOV[BH]`
binary.BigEndian.PutUint32(b[idx:], sink32) binary.BigEndian.PutUint32(b[idx:], sink32)
} }
func store_be16(b []byte) { func store_be16(b []byte) {
// amd64:`ROLW\s\$8`,-`SHR.` // amd64:`ROLW\s\$8`,-`SHR.`
// arm64(DISABLED):`MOVH`,`REV16W`,-`MOVB` // arm64:`MOVH`,`REV16W`,-`MOVB`
binary.BigEndian.PutUint16(b, sink16) binary.BigEndian.PutUint16(b, sink16)
} }
func store_be16_idx(b []byte, idx int) { func store_be16_idx(b []byte, idx int) {
// amd64:`ROLW\s\$8`,-`SHR.` // amd64:`ROLW\s\$8`,-`SHR.`
// arm64(DISABLED):`MOVH`,`REV16W`,-`MOVB` // arm64:`MOVH`,`REV16W`,-`MOVB`
binary.BigEndian.PutUint16(b[idx:], sink16) binary.BigEndian.PutUint16(b[idx:], sink16)
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment