mirror of
https://github.com/golang/go
synced 2024-11-05 18:36:08 +00:00
cmd/6g, cmd/8g: skip CONVNOP nodes in bgen.
Revision 3ae4607a43ff introduced CONVNOP layers to fix type checking issues arising from comparisons. The added complexity made 8g run out of registers when compiling an equality function in go.net/ipv6. A similar issue occurred in test/sizeof.go on amd64p32 with 6g. Fixes #7405. LGTM=khr R=rsc, dave, iant, khr CC=golang-codereviews https://golang.org/cl/78100044
This commit is contained in:
parent
ea7d801130
commit
0285d2b96b
3 changed files with 64 additions and 0 deletions
|
@ -1061,6 +1061,12 @@ bgen(Node *n, int true, int likely, Prog *to)
|
|||
}
|
||||
nr = N;
|
||||
|
||||
while(n->op == OCONVNOP) {
|
||||
n = n->left;
|
||||
if(n->ninit != nil)
|
||||
genlist(n->ninit);
|
||||
}
|
||||
|
||||
switch(n->op) {
|
||||
default:
|
||||
def:
|
||||
|
|
|
@ -935,6 +935,13 @@ bgen(Node *n, int true, int likely, Prog *to)
|
|||
patch(gins(AEND, N, N), to);
|
||||
return;
|
||||
}
|
||||
|
||||
while(n->op == OCONVNOP) {
|
||||
n = n->left;
|
||||
if(n->ninit != nil)
|
||||
genlist(n->ninit);
|
||||
}
|
||||
|
||||
nl = n->left;
|
||||
nr = N;
|
||||
|
||||
|
|
51
test/fixedbugs/issue7405.go
Normal file
51
test/fixedbugs/issue7405.go
Normal file
|
@ -0,0 +1,51 @@
|
|||
// compile
|
||||
|
||||
// Copyright 2014 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 7405: the equality function for struct with many
|
||||
// embedded fields became more complex after fixing issue 7366,
|
||||
// leading to out of registers on 386.
|
||||
|
||||
package p
|
||||
|
||||
type T1 struct {
|
||||
T2
|
||||
T3
|
||||
T4
|
||||
}
|
||||
|
||||
type T2 struct {
|
||||
Conn
|
||||
}
|
||||
|
||||
type T3 struct {
|
||||
PacketConn
|
||||
}
|
||||
|
||||
type T4 struct {
|
||||
PacketConn
|
||||
T5
|
||||
}
|
||||
|
||||
type T5 struct {
|
||||
x int
|
||||
T6
|
||||
}
|
||||
|
||||
type T6 struct {
|
||||
y, z int
|
||||
}
|
||||
|
||||
type Conn interface {
|
||||
A()
|
||||
}
|
||||
|
||||
type PacketConn interface {
|
||||
B()
|
||||
}
|
||||
|
||||
func F(a, b T1) bool {
|
||||
return a == b
|
||||
}
|
Loading…
Reference in a new issue