Skip to content

Commit 0ab99b3

Browse files
labogerrsc
authored andcommitted
[release-branch.go1.9] cmd/compile: fix regression in PPC64.rules move zero
When a MOVDstorezero (8 bytes) is used the offset field in the instruction must be a multiple of 4. This situation had been corrected in the rules for other types of stores but not for the zero case. This also removes some of the special MOVDstorezero cases since they can be handled by the general LowerZero case. Updates made to the ssa test for lowering zero moves to include cases where the target is not aligned to at least 4. Fixes #21947 Change-Id: I7cceceb1be4898c77cd3b5e78b58dce0a7e28edd Reviewed-on: https://go-review.googlesource.com/64970 Run-TryBot: Lynn Boger <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Carlos Eduardo Seo <[email protected]> Reviewed-by: Cherry Zhang <[email protected]> Reviewed-on: https://go-review.googlesource.com/70978 Run-TryBot: Russ Cox <[email protected]>
1 parent 8d4279c commit 0ab99b3

File tree

4 files changed

+350
-159
lines changed

4 files changed

+350
-159
lines changed

src/cmd/compile/internal/gc/testdata/gen/zeroGen.go

+63
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
// will be written into the parent directory containing the tests.
2020

2121
var sizes = [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 16, 17, 23, 24, 25, 31, 32, 33, 63, 64, 65, 1023, 1024, 1025}
22+
var usizes = [...]int{8, 16, 24, 32, 64, 256}
2223

2324
func main() {
2425
w := new(bytes.Buffer)
@@ -61,12 +62,74 @@ func main() {
6162
fmt.Fprintf(w, "}\n")
6263
}
6364

65+
for _, s := range usizes {
66+
// type for test
67+
fmt.Fprintf(w, "type T%du1 struct {\n", s)
68+
fmt.Fprintf(w, " b bool\n")
69+
fmt.Fprintf(w, " val [%d]byte\n", s)
70+
fmt.Fprintf(w, "}\n")
71+
72+
fmt.Fprintf(w, "type T%du2 struct {\n", s)
73+
fmt.Fprintf(w, " i uint16\n")
74+
fmt.Fprintf(w, " val [%d]byte\n", s)
75+
fmt.Fprintf(w, "}\n")
76+
77+
// function being tested
78+
fmt.Fprintf(w, "//go:noinline\n")
79+
fmt.Fprintf(w, "func zero%du1_ssa(t *T%du1) {\n", s, s)
80+
fmt.Fprintf(w, " t.val = [%d]byte{}\n", s)
81+
fmt.Fprintf(w, "}\n")
82+
83+
// function being tested
84+
fmt.Fprintf(w, "//go:noinline\n")
85+
fmt.Fprintf(w, "func zero%du2_ssa(t *T%du2) {\n", s, s)
86+
fmt.Fprintf(w, " t.val = [%d]byte{}\n", s)
87+
fmt.Fprintf(w, "}\n")
88+
89+
// testing harness
90+
fmt.Fprintf(w, "func testZero%du() {\n", s)
91+
fmt.Fprintf(w, " a := T%du1{false, [%d]byte{", s, s)
92+
for i := 0; i < s; i++ {
93+
fmt.Fprintf(w, "255,")
94+
}
95+
fmt.Fprintf(w, "}}\n")
96+
fmt.Fprintf(w, " zero%du1_ssa(&a)\n", s)
97+
fmt.Fprintf(w, " want := T%du1{false, [%d]byte{", s, s)
98+
for i := 0; i < s; i++ {
99+
fmt.Fprintf(w, "0,")
100+
}
101+
fmt.Fprintf(w, "}}\n")
102+
fmt.Fprintf(w, " if a != want {\n")
103+
fmt.Fprintf(w, " fmt.Printf(\"zero%du2 got=%%v, want %%v\\n\", a, want)\n", s)
104+
fmt.Fprintf(w, " failed=true\n")
105+
fmt.Fprintf(w, " }\n")
106+
fmt.Fprintf(w, " b := T%du2{15, [%d]byte{", s, s)
107+
for i := 0; i < s; i++ {
108+
fmt.Fprintf(w, "255,")
109+
}
110+
fmt.Fprintf(w, "}}\n")
111+
fmt.Fprintf(w, " zero%du2_ssa(&b)\n", s)
112+
fmt.Fprintf(w, " wantb := T%du2{15, [%d]byte{", s, s)
113+
for i := 0; i < s; i++ {
114+
fmt.Fprintf(w, "0,")
115+
}
116+
fmt.Fprintf(w, "}}\n")
117+
fmt.Fprintf(w, " if b != wantb {\n")
118+
fmt.Fprintf(w, " fmt.Printf(\"zero%du2 got=%%v, want %%v\\n\", b, wantb)\n", s)
119+
fmt.Fprintf(w, " failed=true\n")
120+
fmt.Fprintf(w, " }\n")
121+
fmt.Fprintf(w, "}\n")
122+
}
123+
64124
// boilerplate at end
65125
fmt.Fprintf(w, "var failed bool\n")
66126
fmt.Fprintf(w, "func main() {\n")
67127
for _, s := range sizes {
68128
fmt.Fprintf(w, " testZero%d()\n", s)
69129
}
130+
for _, s := range usizes {
131+
fmt.Fprintf(w, " testZero%du()\n", s)
132+
}
70133
fmt.Fprintf(w, " if failed {\n")
71134
fmt.Fprintf(w, " panic(\"failed\")\n")
72135
fmt.Fprintf(w, " }\n")

src/cmd/compile/internal/gc/testdata/zero.go

+216
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/cmd/compile/internal/ssa/gen/PPC64.rules

+19-39
Original file line numberDiff line numberDiff line change
@@ -526,49 +526,29 @@
526526
(MOVBstorezero [6] destptr
527527
(MOVHstorezero [4] destptr
528528
(MOVWstorezero destptr mem)))
529-
(Zero [8] destptr mem) ->
530-
(MOVDstorezero destptr mem)
531529

532-
// Zero small numbers of words directly.
533-
(Zero [12] destptr mem) ->
530+
// MOVD for store with DS must have offsets that are multiple of 4
531+
(Zero [8] {t} destptr mem) && t.(*types.Type).Alignment()%4 == 0 ->
532+
(MOVDstorezero destptr mem)
533+
(Zero [8] destptr mem) ->
534+
(MOVWstorezero [4] destptr
535+
(MOVWstorezero [0] destptr mem))
536+
// Handle these cases only if aligned properly, otherwise use general case below
537+
(Zero [12] {t} destptr mem) && t.(*types.Type).Alignment()%4 == 0 ->
534538
(MOVWstorezero [8] destptr
535539
(MOVDstorezero [0] destptr mem))
536-
(Zero [16] destptr mem) ->
537-
(MOVDstorezero [8] destptr
540+
(Zero [16] {t} destptr mem) && t.(*types.Type).Alignment()%4 == 0 ->
541+
(MOVDstorezero [8] destptr
538542
(MOVDstorezero [0] destptr mem))
539-
(Zero [24] destptr mem) ->
540-
(MOVDstorezero [16] destptr
541-
(MOVDstorezero [8] destptr
542-
(MOVDstorezero [0] destptr mem)))
543-
(Zero [32] destptr mem) ->
544-
(MOVDstorezero [24] destptr
545-
(MOVDstorezero [16] destptr
546-
(MOVDstorezero [8] destptr
547-
(MOVDstorezero [0] destptr mem))))
548-
549-
(Zero [40] destptr mem) ->
550-
(MOVDstorezero [32] destptr
551-
(MOVDstorezero [24] destptr
552-
(MOVDstorezero [16] destptr
553-
(MOVDstorezero [8] destptr
554-
(MOVDstorezero [0] destptr mem)))))
555-
556-
(Zero [48] destptr mem) ->
557-
(MOVDstorezero [40] destptr
558-
(MOVDstorezero [32] destptr
559-
(MOVDstorezero [24] destptr
560-
(MOVDstorezero [16] destptr
561-
(MOVDstorezero [8] destptr
562-
(MOVDstorezero [0] destptr mem))))))
563-
564-
(Zero [56] destptr mem) ->
565-
(MOVDstorezero [48] destptr
566-
(MOVDstorezero [40] destptr
567-
(MOVDstorezero [32] destptr
568-
(MOVDstorezero [24] destptr
569-
(MOVDstorezero [16] destptr
570-
(MOVDstorezero [8] destptr
571-
(MOVDstorezero [0] destptr mem)))))))
543+
(Zero [24] {t} destptr mem) && t.(*types.Type).Alignment()%4 == 0 ->
544+
(MOVDstorezero [16] destptr
545+
(MOVDstorezero [8] destptr
546+
(MOVDstorezero [0] destptr mem)))
547+
(Zero [32] {t} destptr mem) && t.(*types.Type).Alignment()%4 == 0 ->
548+
(MOVDstorezero [24] destptr
549+
(MOVDstorezero [16] destptr
550+
(MOVDstorezero [8] destptr
551+
(MOVDstorezero [0] destptr mem))))
572552

573553
// Handle cases not handled above
574554
(Zero [s] ptr mem) -> (LoweredZero [s] ptr mem)

0 commit comments

Comments
 (0)