mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd: remove some unnecessary gotos
Pick the low-hanging fruit, which are the gotos that don't go very far and labels that aren't used often. All of them have easy replacements with breaks and returns. One slightly tricky rewrite is defaultlitreuse. We cannot use a defer func to reset lineno, because one of its return paths does not reset lineno, and thus broke toolstash -cmp. Passes toolstash -cmp on std cmd. Change-Id: Id1c0967868d69bb073addc7c5c3017ca91ff966f Reviewed-on: https://go-review.googlesource.com/110063 Run-TryBot: Daniel Martí <mvdan@mvdan.cc> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
parent
030ac2c719
commit
9ecf899b29
7 changed files with 25 additions and 41 deletions
|
|
@ -1344,6 +1344,8 @@ func defaultlitreuse(n *Node, t *types.Type, reuse canReuseNode) *Node {
|
||||||
default:
|
default:
|
||||||
yyerror("defaultlit: unknown literal: %v", n)
|
yyerror("defaultlit: unknown literal: %v", n)
|
||||||
}
|
}
|
||||||
|
lineno = lno
|
||||||
|
return n
|
||||||
|
|
||||||
case CTxxx:
|
case CTxxx:
|
||||||
Fatalf("defaultlit: idealkind is CTxxx: %+v", n)
|
Fatalf("defaultlit: idealkind is CTxxx: %+v", n)
|
||||||
|
|
@ -1354,28 +1356,19 @@ func defaultlitreuse(n *Node, t *types.Type, reuse canReuseNode) *Node {
|
||||||
t1 = t
|
t1 = t
|
||||||
}
|
}
|
||||||
n = convlit1(n, t1, false, reuse)
|
n = convlit1(n, t1, false, reuse)
|
||||||
|
|
||||||
case CTINT:
|
|
||||||
t1 = types.Types[TINT]
|
|
||||||
goto num
|
|
||||||
|
|
||||||
case CTRUNE:
|
|
||||||
t1 = types.Runetype
|
|
||||||
goto num
|
|
||||||
|
|
||||||
case CTFLT:
|
|
||||||
t1 = types.Types[TFLOAT64]
|
|
||||||
goto num
|
|
||||||
|
|
||||||
case CTCPLX:
|
|
||||||
t1 = types.Types[TCOMPLEX128]
|
|
||||||
goto num
|
|
||||||
}
|
|
||||||
|
|
||||||
lineno = lno
|
lineno = lno
|
||||||
return n
|
return n
|
||||||
|
|
||||||
num:
|
case CTINT:
|
||||||
|
t1 = types.Types[TINT]
|
||||||
|
case CTRUNE:
|
||||||
|
t1 = types.Runetype
|
||||||
|
case CTFLT:
|
||||||
|
t1 = types.Types[TFLOAT64]
|
||||||
|
case CTCPLX:
|
||||||
|
t1 = types.Types[TCOMPLEX128]
|
||||||
|
}
|
||||||
|
|
||||||
// Note: n.Val().Ctype() can be CTxxx (not a constant) here
|
// Note: n.Val().Ctype() can be CTxxx (not a constant) here
|
||||||
// in the case of an untyped non-constant value, like 1<<i.
|
// in the case of an untyped non-constant value, like 1<<i.
|
||||||
v1 := n.Val()
|
v1 := n.Val()
|
||||||
|
|
|
||||||
|
|
@ -1008,7 +1008,8 @@ opswitch:
|
||||||
case OCONV, OCONVNOP:
|
case OCONV, OCONVNOP:
|
||||||
if thearch.SoftFloat {
|
if thearch.SoftFloat {
|
||||||
// For the soft-float case, ssa.go handles these conversions.
|
// For the soft-float case, ssa.go handles these conversions.
|
||||||
goto oconv_walkexpr
|
n.Left = walkexpr(n.Left, init)
|
||||||
|
break
|
||||||
}
|
}
|
||||||
switch thearch.LinkArch.Family {
|
switch thearch.LinkArch.Family {
|
||||||
case sys.ARM, sys.MIPS:
|
case sys.ARM, sys.MIPS:
|
||||||
|
|
@ -1062,8 +1063,6 @@ opswitch:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
oconv_walkexpr:
|
|
||||||
n.Left = walkexpr(n.Left, init)
|
n.Left = walkexpr(n.Left, init)
|
||||||
|
|
||||||
case OANDNOT:
|
case OANDNOT:
|
||||||
|
|
|
||||||
|
|
@ -1470,7 +1470,7 @@ func (c *ctxt7) aclass(a *obj.Addr) int {
|
||||||
case obj.NAME_NONE:
|
case obj.NAME_NONE:
|
||||||
c.instoffset = a.Offset
|
c.instoffset = a.Offset
|
||||||
if a.Reg != 0 && a.Reg != REGZERO {
|
if a.Reg != 0 && a.Reg != REGZERO {
|
||||||
goto aconsize
|
break
|
||||||
}
|
}
|
||||||
v := c.instoffset
|
v := c.instoffset
|
||||||
if v == 0 {
|
if v == 0 {
|
||||||
|
|
@ -1516,7 +1516,7 @@ func (c *ctxt7) aclass(a *obj.Addr) int {
|
||||||
|
|
||||||
case obj.NAME_EXTERN, obj.NAME_STATIC:
|
case obj.NAME_EXTERN, obj.NAME_STATIC:
|
||||||
if a.Sym == nil {
|
if a.Sym == nil {
|
||||||
break
|
return C_GOK
|
||||||
}
|
}
|
||||||
if a.Sym.Type == objabi.STLSBSS {
|
if a.Sym.Type == objabi.STLSBSS {
|
||||||
c.ctxt.Diag("taking address of TLS variable is not supported")
|
c.ctxt.Diag("taking address of TLS variable is not supported")
|
||||||
|
|
@ -1531,7 +1531,6 @@ func (c *ctxt7) aclass(a *obj.Addr) int {
|
||||||
a.Reg = obj.REG_NONE
|
a.Reg = obj.REG_NONE
|
||||||
}
|
}
|
||||||
c.instoffset = int64(c.autosize) + a.Offset
|
c.instoffset = int64(c.autosize) + a.Offset
|
||||||
goto aconsize
|
|
||||||
|
|
||||||
case obj.NAME_PARAM:
|
case obj.NAME_PARAM:
|
||||||
if a.Reg == REGSP {
|
if a.Reg == REGSP {
|
||||||
|
|
@ -1540,11 +1539,10 @@ func (c *ctxt7) aclass(a *obj.Addr) int {
|
||||||
a.Reg = obj.REG_NONE
|
a.Reg = obj.REG_NONE
|
||||||
}
|
}
|
||||||
c.instoffset = int64(c.autosize) + a.Offset + 8
|
c.instoffset = int64(c.autosize) + a.Offset + 8
|
||||||
goto aconsize
|
default:
|
||||||
}
|
|
||||||
return C_GOK
|
return C_GOK
|
||||||
|
}
|
||||||
|
|
||||||
aconsize:
|
|
||||||
if isaddcon(c.instoffset) {
|
if isaddcon(c.instoffset) {
|
||||||
return C_AACON
|
return C_AACON
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -612,13 +612,11 @@ func (c *ctxt0) aclass(a *obj.Addr) int {
|
||||||
return C_DACON
|
return C_DACON
|
||||||
}
|
}
|
||||||
|
|
||||||
goto consize
|
|
||||||
|
|
||||||
case obj.NAME_EXTERN,
|
case obj.NAME_EXTERN,
|
||||||
obj.NAME_STATIC:
|
obj.NAME_STATIC:
|
||||||
s := a.Sym
|
s := a.Sym
|
||||||
if s == nil {
|
if s == nil {
|
||||||
break
|
return C_GOK
|
||||||
}
|
}
|
||||||
|
|
||||||
c.instoffset = a.Offset
|
c.instoffset = a.Offset
|
||||||
|
|
@ -650,11 +648,11 @@ func (c *ctxt0) aclass(a *obj.Addr) int {
|
||||||
return C_SACON
|
return C_SACON
|
||||||
}
|
}
|
||||||
return C_LACON
|
return C_LACON
|
||||||
|
|
||||||
|
default:
|
||||||
|
return C_GOK
|
||||||
}
|
}
|
||||||
|
|
||||||
return C_GOK
|
|
||||||
|
|
||||||
consize:
|
|
||||||
if c.instoffset >= 0 {
|
if c.instoffset >= 0 {
|
||||||
if c.instoffset == 0 {
|
if c.instoffset == 0 {
|
||||||
return C_ZCON
|
return C_ZCON
|
||||||
|
|
|
||||||
|
|
@ -878,21 +878,20 @@ func (c *ctxt0) sched(p0, pe *obj.Prog) {
|
||||||
t = sch[j:]
|
t = sch[j:]
|
||||||
if t[0].comp {
|
if t[0].comp {
|
||||||
if s[0].p.Mark&BRANCH != 0 {
|
if s[0].p.Mark&BRANCH != 0 {
|
||||||
goto no2
|
continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if t[0].p.Mark&DELAY != 0 {
|
if t[0].p.Mark&DELAY != 0 {
|
||||||
if -cap(s) >= -cap(se) || conflict(&t[0], &s[1]) {
|
if -cap(s) >= -cap(se) || conflict(&t[0], &s[1]) {
|
||||||
goto no2
|
continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for u := t[1:]; -cap(u) <= -cap(s); u = u[1:] {
|
for u := t[1:]; -cap(u) <= -cap(s); u = u[1:] {
|
||||||
if c.depend(&u[0], &t[0]) {
|
if c.depend(&u[0], &t[0]) {
|
||||||
goto no2
|
continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
goto out2
|
goto out2
|
||||||
no2:
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if s[0].p.Mark&BRANCH != 0 {
|
if s[0].p.Mark&BRANCH != 0 {
|
||||||
|
|
|
||||||
|
|
@ -844,13 +844,11 @@ func (c *ctxt9) aclass(a *obj.Addr) int {
|
||||||
return C_DACON
|
return C_DACON
|
||||||
}
|
}
|
||||||
|
|
||||||
goto consize
|
|
||||||
|
|
||||||
case obj.NAME_EXTERN,
|
case obj.NAME_EXTERN,
|
||||||
obj.NAME_STATIC:
|
obj.NAME_STATIC:
|
||||||
s := a.Sym
|
s := a.Sym
|
||||||
if s == nil {
|
if s == nil {
|
||||||
break
|
return C_GOK
|
||||||
}
|
}
|
||||||
|
|
||||||
c.instoffset = a.Offset
|
c.instoffset = a.Offset
|
||||||
|
|
@ -871,11 +869,11 @@ func (c *ctxt9) aclass(a *obj.Addr) int {
|
||||||
return C_SACON
|
return C_SACON
|
||||||
}
|
}
|
||||||
return C_LACON
|
return C_LACON
|
||||||
|
|
||||||
|
default:
|
||||||
|
return C_GOK
|
||||||
}
|
}
|
||||||
|
|
||||||
return C_GOK
|
|
||||||
|
|
||||||
consize:
|
|
||||||
if c.instoffset >= 0 {
|
if c.instoffset >= 0 {
|
||||||
if c.instoffset == 0 {
|
if c.instoffset == 0 {
|
||||||
return C_ZCON
|
return C_ZCON
|
||||||
|
|
|
||||||
|
|
@ -570,13 +570,12 @@ func (c *ctxtz) aclass(a *obj.Addr) int {
|
||||||
}
|
}
|
||||||
return C_DACON
|
return C_DACON
|
||||||
}
|
}
|
||||||
goto consize
|
|
||||||
|
|
||||||
case obj.NAME_EXTERN,
|
case obj.NAME_EXTERN,
|
||||||
obj.NAME_STATIC:
|
obj.NAME_STATIC:
|
||||||
s := a.Sym
|
s := a.Sym
|
||||||
if s == nil {
|
if s == nil {
|
||||||
break
|
return C_GOK
|
||||||
}
|
}
|
||||||
c.instoffset = a.Offset
|
c.instoffset = a.Offset
|
||||||
|
|
||||||
|
|
@ -605,11 +604,11 @@ func (c *ctxtz) aclass(a *obj.Addr) int {
|
||||||
return C_SACON
|
return C_SACON
|
||||||
}
|
}
|
||||||
return C_LACON
|
return C_LACON
|
||||||
|
|
||||||
|
default:
|
||||||
|
return C_GOK
|
||||||
}
|
}
|
||||||
|
|
||||||
return C_GOK
|
|
||||||
|
|
||||||
consize:
|
|
||||||
if c.instoffset == 0 {
|
if c.instoffset == 0 {
|
||||||
return C_ZCON
|
return C_ZCON
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue