From bbccfddb84473c10e95b1b80f8c6f68a8238a7d5 Mon Sep 17 00:00:00 2001 From: Dave Cheney Date: Sat, 6 Oct 2012 21:01:49 +1000 Subject: [PATCH] cmd/5g: avoid temporary during constant asop func add() int { var a int a += 10 a += 20 a += 30 a -= 10 a -= 20 a -= 30 return a } before --- prog list "add" --- 0000 (/home/dfc/src/add.go:5) TEXT add+0(SB),$0-4 0001 (/home/dfc/src/add.go:6) MOVW $0,R2 0002 (/home/dfc/src/add.go:7) MOVW $10,R0 0003 (/home/dfc/src/add.go:7) ADD R0,R2,R1 0004 (/home/dfc/src/add.go:8) MOVW $20,R0 0005 (/home/dfc/src/add.go:8) ADD R0,R1 0006 (/home/dfc/src/add.go:9) MOVW $30,R0 0007 (/home/dfc/src/add.go:9) ADD R0,R1 0008 (/home/dfc/src/add.go:10) MOVW $10,R0 0009 (/home/dfc/src/add.go:10) SUB R0,R1 0010 (/home/dfc/src/add.go:11) MOVW $20,R0 0011 (/home/dfc/src/add.go:11) SUB R0,R1 0012 (/home/dfc/src/add.go:12) MOVW $30,R0 0013 (/home/dfc/src/add.go:12) SUB R0,R1,R2 0014 (/home/dfc/src/add.go:12) MOVW R2,R0 0015 (/home/dfc/src/add.go:13) MOVW R2,R1 0016 (/home/dfc/src/add.go:13) MOVW R2,.noname+0(FP) 0017 (/home/dfc/src/add.go:13) RET , after --- prog list "add" --- 0000 (/home/dfc/src/add.go:5) TEXT add+0(SB),$0-4 0001 (/home/dfc/src/add.go:6) MOVW $0,R0 0002 (/home/dfc/src/add.go:7) ADD $10,R0 0003 (/home/dfc/src/add.go:8) ADD $20,R0 0004 (/home/dfc/src/add.go:9) ADD $30,R0 0005 (/home/dfc/src/add.go:10) SUB $10,R0 0006 (/home/dfc/src/add.go:11) SUB $20,R0 0007 (/home/dfc/src/add.go:12) SUB $30,R0,R2 0008 (/home/dfc/src/add.go:13) MOVW R2,R0 0009 (/home/dfc/src/add.go:13) MOVW R2,.noname+0(FP) 0010 (/home/dfc/src/add.go:13) RET , R=rsc, minux.ma, remyoudompheng CC=golang-dev https://golang.org/cl/6584056 --- src/cmd/5g/ggen.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/cmd/5g/ggen.c b/src/cmd/5g/ggen.c index 85f63a2f7a..09e8550506 100644 --- a/src/cmd/5g/ggen.c +++ b/src/cmd/5g/ggen.c @@ -371,14 +371,19 @@ cgen_asop(Node *n) case OOR: a = optoas(n->etype, nl->type); if(nl->addable) { - regalloc(&n3, nr->type, N); - cgen(nr, &n3); + if(smallintconst(nr)) + n3 = *nr; + else { + regalloc(&n3, nr->type, N); + cgen(nr, &n3); + } regalloc(&n2, nl->type, N); cgen(nl, &n2); gins(a, &n3, &n2); cgen(&n2, nl); regfree(&n2); - regfree(&n3); + if(n3.op != OLITERAL) + regfree(&n3); goto ret; } if(nr->ullman < UINF) -- 2.48.1