mirror of
https://github.com/golang/go
synced 2024-11-25 19:17:57 -07:00
cmd/compile: correct type of pointer difference on RISCV64
Pointer comparison is lowered to the following on RISCV64 (EqPtr x y) => (SEQZ (SUB <x.Type> x y)) The difference of two pointers (the SUB) should not be pointer type. Otherwise it can cause the GC to find a bad pointer. Should fix #51101. Change-Id: I7e73c2155c36ff403c032981a9aa9cccbfdf0f64 Reviewed-on: https://go-review.googlesource.com/c/go/+/385655 Trust: Cherry Mui <cherryyz@google.com> Run-TryBot: Cherry Mui <cherryyz@google.com> Reviewed-by: Keith Randall <khr@golang.org> TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
parent
ada95e2807
commit
1ed30ca537
@ -256,7 +256,7 @@
|
|||||||
(Leq64F ...) => (FLED ...)
|
(Leq64F ...) => (FLED ...)
|
||||||
(Leq32F ...) => (FLES ...)
|
(Leq32F ...) => (FLES ...)
|
||||||
|
|
||||||
(EqPtr x y) => (SEQZ (SUB <x.Type> x y))
|
(EqPtr x y) => (SEQZ (SUB <typ.Uintptr> x y))
|
||||||
(Eq64 x y) => (SEQZ (SUB <x.Type> x y))
|
(Eq64 x y) => (SEQZ (SUB <x.Type> x y))
|
||||||
(Eq32 x y) => (SEQZ (SUB <x.Type> (ZeroExt32to64 x) (ZeroExt32to64 y)))
|
(Eq32 x y) => (SEQZ (SUB <x.Type> (ZeroExt32to64 x) (ZeroExt32to64 y)))
|
||||||
(Eq16 x y) => (SEQZ (SUB <x.Type> (ZeroExt16to64 x) (ZeroExt16to64 y)))
|
(Eq16 x y) => (SEQZ (SUB <x.Type> (ZeroExt16to64 x) (ZeroExt16to64 y)))
|
||||||
@ -264,7 +264,7 @@
|
|||||||
(Eq64F ...) => (FEQD ...)
|
(Eq64F ...) => (FEQD ...)
|
||||||
(Eq32F ...) => (FEQS ...)
|
(Eq32F ...) => (FEQS ...)
|
||||||
|
|
||||||
(NeqPtr x y) => (SNEZ (SUB <x.Type> x y))
|
(NeqPtr x y) => (SNEZ (SUB <typ.Uintptr> x y))
|
||||||
(Neq64 x y) => (SNEZ (SUB <x.Type> x y))
|
(Neq64 x y) => (SNEZ (SUB <x.Type> x y))
|
||||||
(Neq32 x y) => (SNEZ (SUB <x.Type> (ZeroExt32to64 x) (ZeroExt32to64 y)))
|
(Neq32 x y) => (SNEZ (SUB <x.Type> (ZeroExt32to64 x) (ZeroExt32to64 y)))
|
||||||
(Neq16 x y) => (SNEZ (SUB <x.Type> (ZeroExt16to64 x) (ZeroExt16to64 y)))
|
(Neq16 x y) => (SNEZ (SUB <x.Type> (ZeroExt16to64 x) (ZeroExt16to64 y)))
|
||||||
|
@ -1124,13 +1124,14 @@ func rewriteValueRISCV64_OpEqPtr(v *Value) bool {
|
|||||||
v_1 := v.Args[1]
|
v_1 := v.Args[1]
|
||||||
v_0 := v.Args[0]
|
v_0 := v.Args[0]
|
||||||
b := v.Block
|
b := v.Block
|
||||||
|
typ := &b.Func.Config.Types
|
||||||
// match: (EqPtr x y)
|
// match: (EqPtr x y)
|
||||||
// result: (SEQZ (SUB <x.Type> x y))
|
// result: (SEQZ (SUB <typ.Uintptr> x y))
|
||||||
for {
|
for {
|
||||||
x := v_0
|
x := v_0
|
||||||
y := v_1
|
y := v_1
|
||||||
v.reset(OpRISCV64SEQZ)
|
v.reset(OpRISCV64SEQZ)
|
||||||
v0 := b.NewValue0(v.Pos, OpRISCV64SUB, x.Type)
|
v0 := b.NewValue0(v.Pos, OpRISCV64SUB, typ.Uintptr)
|
||||||
v0.AddArg2(x, y)
|
v0.AddArg2(x, y)
|
||||||
v.AddArg(v0)
|
v.AddArg(v0)
|
||||||
return true
|
return true
|
||||||
@ -2673,13 +2674,14 @@ func rewriteValueRISCV64_OpNeqPtr(v *Value) bool {
|
|||||||
v_1 := v.Args[1]
|
v_1 := v.Args[1]
|
||||||
v_0 := v.Args[0]
|
v_0 := v.Args[0]
|
||||||
b := v.Block
|
b := v.Block
|
||||||
|
typ := &b.Func.Config.Types
|
||||||
// match: (NeqPtr x y)
|
// match: (NeqPtr x y)
|
||||||
// result: (SNEZ (SUB <x.Type> x y))
|
// result: (SNEZ (SUB <typ.Uintptr> x y))
|
||||||
for {
|
for {
|
||||||
x := v_0
|
x := v_0
|
||||||
y := v_1
|
y := v_1
|
||||||
v.reset(OpRISCV64SNEZ)
|
v.reset(OpRISCV64SNEZ)
|
||||||
v0 := b.NewValue0(v.Pos, OpRISCV64SUB, x.Type)
|
v0 := b.NewValue0(v.Pos, OpRISCV64SUB, typ.Uintptr)
|
||||||
v0.AddArg2(x, y)
|
v0.AddArg2(x, y)
|
||||||
v.AddArg(v0)
|
v.AddArg(v0)
|
||||||
return true
|
return true
|
||||||
|
36
test/fixedbugs/issue51101.go
Normal file
36
test/fixedbugs/issue51101.go
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
// run
|
||||||
|
|
||||||
|
// Copyright 2022 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.
|
||||||
|
|
||||||
|
// Issue 51101: on RISCV64, difference of two pointers
|
||||||
|
// was marked as pointer and crashes GC.
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
var a, b int
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
F(&b, &a)
|
||||||
|
}
|
||||||
|
|
||||||
|
//go:noinline
|
||||||
|
func F(a, b *int) bool {
|
||||||
|
x := a == b
|
||||||
|
G(x)
|
||||||
|
y := a != b
|
||||||
|
return y
|
||||||
|
}
|
||||||
|
|
||||||
|
//go:noinline
|
||||||
|
func G(bool) {
|
||||||
|
grow([1000]int{20})
|
||||||
|
}
|
||||||
|
|
||||||
|
func grow(x [1000]int) {
|
||||||
|
if x[0] != 0 {
|
||||||
|
x[0]--
|
||||||
|
grow(x)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user