Commit 0285d2b9 authored by Rémy Oudompheng's avatar Rémy Oudompheng

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
parent ea7d8011
......@@ -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;
......
// 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
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment