Skip to content

Commit c96e3bc

Browse files
committed
cmd/compile: fix type of OffPtr in some optimization rules
In some optimization rules the type of generated OffPtr was incorrectly set to the type of the pointee, instead of the pointer. When the OffPtr value is spilled, this may generate a spill of the wrong type, e.g. a floating point spill of an integer (pointer) value. On Wasm, this leads to invalid bytecode. Fixes #27961. Change-Id: I5d464847eb900ed90794105c0013a1a7330756cc Reviewed-on: https://go-review.googlesource.com/c/139257 Run-TryBot: Cherry Zhang <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Keith Randall <[email protected]> Reviewed-by: Richard Musiol <[email protected]>
1 parent 54f5a66 commit c96e3bc

File tree

4 files changed

+120
-67
lines changed

4 files changed

+120
-67
lines changed

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

+36-36
Original file line numberDiff line numberDiff line change
@@ -1545,21 +1545,21 @@
15451545
// Don't Move from memory if the values are likely to already be
15461546
// in registers.
15471547
(Move {t1} [n] dst p1
1548-
mem:(Store {t2} op2:(OffPtr [o2] p2) d1
1549-
(Store {t3} op3:(OffPtr [0] p3) d2 _)))
1548+
mem:(Store {t2} op2:(OffPtr <tt2> [o2] p2) d1
1549+
(Store {t3} op3:(OffPtr <tt3> [0] p3) d2 _)))
15501550
&& isSamePtr(p1, p2) && isSamePtr(p2, p3)
15511551
&& alignof(t2) <= alignof(t1)
15521552
&& alignof(t3) <= alignof(t1)
15531553
&& registerizable(b, t2)
15541554
&& registerizable(b, t3)
15551555
&& o2 == sizeof(t3)
15561556
&& n == sizeof(t2) + sizeof(t3)
1557-
-> (Store {t2} (OffPtr <t2.(*types.Type)> [o2] dst) d1
1558-
(Store {t3} (OffPtr <t3.(*types.Type)> [0] dst) d2 mem))
1557+
-> (Store {t2} (OffPtr <tt2> [o2] dst) d1
1558+
(Store {t3} (OffPtr <tt3> [0] dst) d2 mem))
15591559
(Move {t1} [n] dst p1
1560-
mem:(Store {t2} op2:(OffPtr [o2] p2) d1
1561-
(Store {t3} op3:(OffPtr [o3] p3) d2
1562-
(Store {t4} op4:(OffPtr [0] p4) d3 _))))
1560+
mem:(Store {t2} op2:(OffPtr <tt2> [o2] p2) d1
1561+
(Store {t3} op3:(OffPtr <tt3> [o3] p3) d2
1562+
(Store {t4} op4:(OffPtr <tt4> [0] p4) d3 _))))
15631563
&& isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4)
15641564
&& alignof(t2) <= alignof(t1)
15651565
&& alignof(t3) <= alignof(t1)
@@ -1570,14 +1570,14 @@
15701570
&& o3 == sizeof(t4)
15711571
&& o2-o3 == sizeof(t3)
15721572
&& n == sizeof(t2) + sizeof(t3) + sizeof(t4)
1573-
-> (Store {t2} (OffPtr <t2.(*types.Type)> [o2] dst) d1
1574-
(Store {t3} (OffPtr <t3.(*types.Type)> [o3] dst) d2
1575-
(Store {t4} (OffPtr <t4.(*types.Type)> [0] dst) d3 mem)))
1573+
-> (Store {t2} (OffPtr <tt2> [o2] dst) d1
1574+
(Store {t3} (OffPtr <tt3> [o3] dst) d2
1575+
(Store {t4} (OffPtr <tt4> [0] dst) d3 mem)))
15761576
(Move {t1} [n] dst p1
1577-
mem:(Store {t2} op2:(OffPtr [o2] p2) d1
1578-
(Store {t3} op3:(OffPtr [o3] p3) d2
1579-
(Store {t4} op4:(OffPtr [o4] p4) d3
1580-
(Store {t5} op5:(OffPtr [0] p5) d4 _)))))
1577+
mem:(Store {t2} op2:(OffPtr <tt2> [o2] p2) d1
1578+
(Store {t3} op3:(OffPtr <tt3> [o3] p3) d2
1579+
(Store {t4} op4:(OffPtr <tt4> [o4] p4) d3
1580+
(Store {t5} op5:(OffPtr <tt5> [0] p5) d4 _)))))
15811581
&& isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5)
15821582
&& alignof(t2) <= alignof(t1)
15831583
&& alignof(t3) <= alignof(t1)
@@ -1591,30 +1591,30 @@
15911591
&& o3-o4 == sizeof(t4)
15921592
&& o2-o3 == sizeof(t3)
15931593
&& n == sizeof(t2) + sizeof(t3) + sizeof(t4) + sizeof(t5)
1594-
-> (Store {t2} (OffPtr <t2.(*types.Type)> [o2] dst) d1
1595-
(Store {t3} (OffPtr <t3.(*types.Type)> [o3] dst) d2
1596-
(Store {t4} (OffPtr <t4.(*types.Type)> [o4] dst) d3
1597-
(Store {t5} (OffPtr <t5.(*types.Type)> [0] dst) d4 mem))))
1594+
-> (Store {t2} (OffPtr <tt2> [o2] dst) d1
1595+
(Store {t3} (OffPtr <tt3> [o3] dst) d2
1596+
(Store {t4} (OffPtr <tt4> [o4] dst) d3
1597+
(Store {t5} (OffPtr <tt5> [0] dst) d4 mem))))
15981598

15991599
// Same thing but with VarDef in the middle.
16001600
(Move {t1} [n] dst p1
16011601
mem:(VarDef
1602-
(Store {t2} op2:(OffPtr [o2] p2) d1
1603-
(Store {t3} op3:(OffPtr [0] p3) d2 _))))
1602+
(Store {t2} op2:(OffPtr <tt2> [o2] p2) d1
1603+
(Store {t3} op3:(OffPtr <tt3> [0] p3) d2 _))))
16041604
&& isSamePtr(p1, p2) && isSamePtr(p2, p3)
16051605
&& alignof(t2) <= alignof(t1)
16061606
&& alignof(t3) <= alignof(t1)
16071607
&& registerizable(b, t2)
16081608
&& registerizable(b, t3)
16091609
&& o2 == sizeof(t3)
16101610
&& n == sizeof(t2) + sizeof(t3)
1611-
-> (Store {t2} (OffPtr <t2.(*types.Type)> [o2] dst) d1
1612-
(Store {t3} (OffPtr <t3.(*types.Type)> [0] dst) d2 mem))
1611+
-> (Store {t2} (OffPtr <tt2> [o2] dst) d1
1612+
(Store {t3} (OffPtr <tt3> [0] dst) d2 mem))
16131613
(Move {t1} [n] dst p1
16141614
mem:(VarDef
1615-
(Store {t2} op2:(OffPtr [o2] p2) d1
1616-
(Store {t3} op3:(OffPtr [o3] p3) d2
1617-
(Store {t4} op4:(OffPtr [0] p4) d3 _)))))
1615+
(Store {t2} op2:(OffPtr <tt2> [o2] p2) d1
1616+
(Store {t3} op3:(OffPtr <tt3> [o3] p3) d2
1617+
(Store {t4} op4:(OffPtr <tt4> [0] p4) d3 _)))))
16181618
&& isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4)
16191619
&& alignof(t2) <= alignof(t1)
16201620
&& alignof(t3) <= alignof(t1)
@@ -1625,15 +1625,15 @@
16251625
&& o3 == sizeof(t4)
16261626
&& o2-o3 == sizeof(t3)
16271627
&& n == sizeof(t2) + sizeof(t3) + sizeof(t4)
1628-
-> (Store {t2} (OffPtr <t2.(*types.Type)> [o2] dst) d1
1629-
(Store {t3} (OffPtr <t3.(*types.Type)> [o3] dst) d2
1630-
(Store {t4} (OffPtr <t4.(*types.Type)> [0] dst) d3 mem)))
1628+
-> (Store {t2} (OffPtr <tt2> [o2] dst) d1
1629+
(Store {t3} (OffPtr <tt3> [o3] dst) d2
1630+
(Store {t4} (OffPtr <tt4> [0] dst) d3 mem)))
16311631
(Move {t1} [n] dst p1
16321632
mem:(VarDef
1633-
(Store {t2} op2:(OffPtr [o2] p2) d1
1634-
(Store {t3} op3:(OffPtr [o3] p3) d2
1635-
(Store {t4} op4:(OffPtr [o4] p4) d3
1636-
(Store {t5} op5:(OffPtr [0] p5) d4 _))))))
1633+
(Store {t2} op2:(OffPtr <tt2> [o2] p2) d1
1634+
(Store {t3} op3:(OffPtr <tt3> [o3] p3) d2
1635+
(Store {t4} op4:(OffPtr <tt4> [o4] p4) d3
1636+
(Store {t5} op5:(OffPtr <tt5> [0] p5) d4 _))))))
16371637
&& isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5)
16381638
&& alignof(t2) <= alignof(t1)
16391639
&& alignof(t3) <= alignof(t1)
@@ -1647,10 +1647,10 @@
16471647
&& o3-o4 == sizeof(t4)
16481648
&& o2-o3 == sizeof(t3)
16491649
&& n == sizeof(t2) + sizeof(t3) + sizeof(t4) + sizeof(t5)
1650-
-> (Store {t2} (OffPtr <t2.(*types.Type)> [o2] dst) d1
1651-
(Store {t3} (OffPtr <t3.(*types.Type)> [o3] dst) d2
1652-
(Store {t4} (OffPtr <t4.(*types.Type)> [o4] dst) d3
1653-
(Store {t5} (OffPtr <t5.(*types.Type)> [0] dst) d4 mem))))
1650+
-> (Store {t2} (OffPtr <tt2> [o2] dst) d1
1651+
(Store {t3} (OffPtr <tt3> [o3] dst) d2
1652+
(Store {t4} (OffPtr <tt4> [o4] dst) d3
1653+
(Store {t5} (OffPtr <tt5> [0] dst) d4 mem))))
16541654

16551655
// Prefer to Zero and Store than to Move.
16561656
(Move {t1} [n] dst p1

src/cmd/compile/internal/ssa/rewriteARM64.go

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

0 commit comments

Comments
 (0)