]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/5g: avoid temporary during constant asop
authorDave Cheney <dave@cheney.net>
Sat, 6 Oct 2012 11:01:49 +0000 (21:01 +1000)
committerDave Cheney <dave@cheney.net>
Sat, 6 Oct 2012 11:01:49 +0000 (21:01 +1000)
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

index 85f63a2f7ade7d25af58ceed83ca3ca073ae0736..09e8550506cc1e71e6ea946d27e9d7e8f2ec2e1a 100644 (file)
@@ -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)