Skip to content

Commit aa09661

Browse files
cherrymuibradfitz
authored andcommitted
[release-branch.go1.11] 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]> (cherry picked from commit c96e3bc) Reviewed-on: https://go-review.googlesource.com/c/139104 Run-TryBot: Brad Fitzpatrick <[email protected]> Reviewed-by: Cherry Zhang <[email protected]>
1 parent 19fe28a commit aa09661

File tree

3 files changed

+119
-66
lines changed

3 files changed

+119
-66
lines changed

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

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1539,21 +1539,21 @@
15391539
// Don't Move from memory if the values are likely to already be
15401540
// in registers.
15411541
(Move {t1} [n] dst p1
1542-
mem:(Store {t2} op2:(OffPtr [o2] p2) d1
1543-
(Store {t3} op3:(OffPtr [0] p3) d2 _)))
1542+
mem:(Store {t2} op2:(OffPtr <tt2> [o2] p2) d1
1543+
(Store {t3} op3:(OffPtr <tt3> [0] p3) d2 _)))
15441544
&& isSamePtr(p1, p2) && isSamePtr(p2, p3)
15451545
&& alignof(t2) <= alignof(t1)
15461546
&& alignof(t3) <= alignof(t1)
15471547
&& registerizable(b, t2)
15481548
&& registerizable(b, t3)
15491549
&& o2 == sizeof(t3)
15501550
&& n == sizeof(t2) + sizeof(t3)
1551-
-> (Store {t2} (OffPtr <t2.(*types.Type)> [o2] dst) d1
1552-
(Store {t3} (OffPtr <t3.(*types.Type)> [0] dst) d2 mem))
1551+
-> (Store {t2} (OffPtr <tt2> [o2] dst) d1
1552+
(Store {t3} (OffPtr <tt3> [0] dst) d2 mem))
15531553
(Move {t1} [n] dst p1
1554-
mem:(Store {t2} op2:(OffPtr [o2] p2) d1
1555-
(Store {t3} op3:(OffPtr [o3] p3) d2
1556-
(Store {t4} op4:(OffPtr [0] p4) d3 _))))
1554+
mem:(Store {t2} op2:(OffPtr <tt2> [o2] p2) d1
1555+
(Store {t3} op3:(OffPtr <tt3> [o3] p3) d2
1556+
(Store {t4} op4:(OffPtr <tt4> [0] p4) d3 _))))
15571557
&& isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4)
15581558
&& alignof(t2) <= alignof(t1)
15591559
&& alignof(t3) <= alignof(t1)
@@ -1564,14 +1564,14 @@
15641564
&& o3 == sizeof(t4)
15651565
&& o2-o3 == sizeof(t3)
15661566
&& n == sizeof(t2) + sizeof(t3) + sizeof(t4)
1567-
-> (Store {t2} (OffPtr <t2.(*types.Type)> [o2] dst) d1
1568-
(Store {t3} (OffPtr <t3.(*types.Type)> [o3] dst) d2
1569-
(Store {t4} (OffPtr <t4.(*types.Type)> [0] dst) d3 mem)))
1567+
-> (Store {t2} (OffPtr <tt2> [o2] dst) d1
1568+
(Store {t3} (OffPtr <tt3> [o3] dst) d2
1569+
(Store {t4} (OffPtr <tt4> [0] dst) d3 mem)))
15701570
(Move {t1} [n] dst p1
1571-
mem:(Store {t2} op2:(OffPtr [o2] p2) d1
1572-
(Store {t3} op3:(OffPtr [o3] p3) d2
1573-
(Store {t4} op4:(OffPtr [o4] p4) d3
1574-
(Store {t5} op5:(OffPtr [0] p5) d4 _)))))
1571+
mem:(Store {t2} op2:(OffPtr <tt2> [o2] p2) d1
1572+
(Store {t3} op3:(OffPtr <tt3> [o3] p3) d2
1573+
(Store {t4} op4:(OffPtr <tt4> [o4] p4) d3
1574+
(Store {t5} op5:(OffPtr <tt5> [0] p5) d4 _)))))
15751575
&& isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5)
15761576
&& alignof(t2) <= alignof(t1)
15771577
&& alignof(t3) <= alignof(t1)
@@ -1585,30 +1585,30 @@
15851585
&& o3-o4 == sizeof(t4)
15861586
&& o2-o3 == sizeof(t3)
15871587
&& n == sizeof(t2) + sizeof(t3) + sizeof(t4) + sizeof(t5)
1588-
-> (Store {t2} (OffPtr <t2.(*types.Type)> [o2] dst) d1
1589-
(Store {t3} (OffPtr <t3.(*types.Type)> [o3] dst) d2
1590-
(Store {t4} (OffPtr <t4.(*types.Type)> [o4] dst) d3
1591-
(Store {t5} (OffPtr <t5.(*types.Type)> [0] dst) d4 mem))))
1588+
-> (Store {t2} (OffPtr <tt2> [o2] dst) d1
1589+
(Store {t3} (OffPtr <tt3> [o3] dst) d2
1590+
(Store {t4} (OffPtr <tt4> [o4] dst) d3
1591+
(Store {t5} (OffPtr <tt5> [0] dst) d4 mem))))
15921592

15931593
// Same thing but with VarDef in the middle.
15941594
(Move {t1} [n] dst p1
15951595
mem:(VarDef
1596-
(Store {t2} op2:(OffPtr [o2] p2) d1
1597-
(Store {t3} op3:(OffPtr [0] p3) d2 _))))
1596+
(Store {t2} op2:(OffPtr <tt2> [o2] p2) d1
1597+
(Store {t3} op3:(OffPtr <tt3> [0] p3) d2 _))))
15981598
&& isSamePtr(p1, p2) && isSamePtr(p2, p3)
15991599
&& alignof(t2) <= alignof(t1)
16001600
&& alignof(t3) <= alignof(t1)
16011601
&& registerizable(b, t2)
16021602
&& registerizable(b, t3)
16031603
&& o2 == sizeof(t3)
16041604
&& n == sizeof(t2) + sizeof(t3)
1605-
-> (Store {t2} (OffPtr <t2.(*types.Type)> [o2] dst) d1
1606-
(Store {t3} (OffPtr <t3.(*types.Type)> [0] dst) d2 mem))
1605+
-> (Store {t2} (OffPtr <tt2> [o2] dst) d1
1606+
(Store {t3} (OffPtr <tt3> [0] dst) d2 mem))
16071607
(Move {t1} [n] dst p1
16081608
mem:(VarDef
1609-
(Store {t2} op2:(OffPtr [o2] p2) d1
1610-
(Store {t3} op3:(OffPtr [o3] p3) d2
1611-
(Store {t4} op4:(OffPtr [0] p4) d3 _)))))
1609+
(Store {t2} op2:(OffPtr <tt2> [o2] p2) d1
1610+
(Store {t3} op3:(OffPtr <tt3> [o3] p3) d2
1611+
(Store {t4} op4:(OffPtr <tt4> [0] p4) d3 _)))))
16121612
&& isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4)
16131613
&& alignof(t2) <= alignof(t1)
16141614
&& alignof(t3) <= alignof(t1)
@@ -1619,15 +1619,15 @@
16191619
&& o3 == sizeof(t4)
16201620
&& o2-o3 == sizeof(t3)
16211621
&& n == sizeof(t2) + sizeof(t3) + sizeof(t4)
1622-
-> (Store {t2} (OffPtr <t2.(*types.Type)> [o2] dst) d1
1623-
(Store {t3} (OffPtr <t3.(*types.Type)> [o3] dst) d2
1624-
(Store {t4} (OffPtr <t4.(*types.Type)> [0] dst) d3 mem)))
1622+
-> (Store {t2} (OffPtr <tt2> [o2] dst) d1
1623+
(Store {t3} (OffPtr <tt3> [o3] dst) d2
1624+
(Store {t4} (OffPtr <tt4> [0] dst) d3 mem)))
16251625
(Move {t1} [n] dst p1
16261626
mem:(VarDef
1627-
(Store {t2} op2:(OffPtr [o2] p2) d1
1628-
(Store {t3} op3:(OffPtr [o3] p3) d2
1629-
(Store {t4} op4:(OffPtr [o4] p4) d3
1630-
(Store {t5} op5:(OffPtr [0] p5) d4 _))))))
1627+
(Store {t2} op2:(OffPtr <tt2> [o2] p2) d1
1628+
(Store {t3} op3:(OffPtr <tt3> [o3] p3) d2
1629+
(Store {t4} op4:(OffPtr <tt4> [o4] p4) d3
1630+
(Store {t5} op5:(OffPtr <tt5> [0] p5) d4 _))))))
16311631
&& isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5)
16321632
&& alignof(t2) <= alignof(t1)
16331633
&& alignof(t3) <= alignof(t1)
@@ -1641,10 +1641,10 @@
16411641
&& o3-o4 == sizeof(t4)
16421642
&& o2-o3 == sizeof(t3)
16431643
&& n == sizeof(t2) + sizeof(t3) + sizeof(t4) + sizeof(t5)
1644-
-> (Store {t2} (OffPtr <t2.(*types.Type)> [o2] dst) d1
1645-
(Store {t3} (OffPtr <t3.(*types.Type)> [o3] dst) d2
1646-
(Store {t4} (OffPtr <t4.(*types.Type)> [o4] dst) d3
1647-
(Store {t5} (OffPtr <t5.(*types.Type)> [0] dst) d4 mem))))
1644+
-> (Store {t2} (OffPtr <tt2> [o2] dst) d1
1645+
(Store {t3} (OffPtr <tt3> [o3] dst) d2
1646+
(Store {t4} (OffPtr <tt4> [o4] dst) d3
1647+
(Store {t5} (OffPtr <tt5> [0] dst) d4 mem))))
16481648

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

0 commit comments

Comments
 (0)