]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/5g: avoid temporaries during gcmp(reg, constant)
authorDave Cheney <dave@cheney.net>
Sun, 7 Oct 2012 22:51:04 +0000 (09:51 +1100)
committerDave Cheney <dave@cheney.net>
Sun, 7 Oct 2012 22:51:04 +0000 (09:51 +1100)
Address several instances of unneeded temporaries when using gcmp.

func M(m map[int]bool) int {
        return len(m)
}

--- prog list "M" ---
0000 (/home/dfc/src/map.go:3) TEXT      M+0(SB),$0-8
0001 (/home/dfc/src/map.go:4) MOVW      m+0(FP),R0
0002 (/home/dfc/src/map.go:4) MOVW      $0,R1
0003 (/home/dfc/src/map.go:4) CMP       R1,R0,
0004 (/home/dfc/src/map.go:4) BEQ       ,6(APC)
0005 (/home/dfc/src/map.go:4) MOVW      0(R0),R0
0006 (/home/dfc/src/map.go:4) MOVW      R0,.noname+4(FP)
0007 (/home/dfc/src/map.go:4) RET       ,

after:

--- prog list "M" ---
0000 (/home/dfc/src/map.go:3) TEXT      M+0(SB),$0-8
0001 (/home/dfc/src/map.go:4) MOVW      m+0(FP),R0
0002 (/home/dfc/src/map.go:4) CMP       $0,R0,
0003 (/home/dfc/src/map.go:4) BEQ       ,5(APC)
0004 (/home/dfc/src/map.go:4) MOVW      0(R0),R0
0005 (/home/dfc/src/map.go:4) MOVW      R0,.noname+4(FP)
0006 (/home/dfc/src/map.go:4) RET       ,

func C(c chan int) int {
        return cap(c)
}

--- prog list "C" ---
0000 (/home/dfc/src/map.go:3) TEXT      C+0(SB),$0-8
0001 (/home/dfc/src/map.go:4) MOVW      c+0(FP),R0
0002 (/home/dfc/src/map.go:4) MOVW      $0,R1
0003 (/home/dfc/src/map.go:4) CMP       R1,R0,
0004 (/home/dfc/src/map.go:4) BEQ       ,6(APC)
0005 (/home/dfc/src/map.go:4) MOVW      4(R0),R0
0006 (/home/dfc/src/map.go:4) MOVW      R0,.noname+4(FP)
0007 (/home/dfc/src/map.go:4) RET       ,

after:

--- prog list "C" ---
0000 (/home/dfc/src/map.go:3) TEXT      C+0(SB),$0-8
0001 (/home/dfc/src/map.go:4) MOVW      c+0(FP),R0
0002 (/home/dfc/src/map.go:4) CMP       $0,R0,
0003 (/home/dfc/src/map.go:4) BEQ       ,5(APC)
0004 (/home/dfc/src/map.go:4) MOVW      4(R0),R0
0005 (/home/dfc/src/map.go:4) MOVW      R0,.noname+4(FP)
0006 (/home/dfc/src/map.go:4) RET       ,

R=rsc, minux.ma, remyoudompheng
CC=golang-dev
https://golang.org/cl/6618054

src/cmd/5g/cgen.c

index 7a2f5e5ab9e6f8450f64ff5dd13ef3562a908d5d..7db5e2134639ed3ce3c52053c8e747b52e4f9338 100644 (file)
@@ -328,10 +328,7 @@ cgen(Node *n, Node *res)
                        cgen(nl, &n1);
 
                        nodconst(&n2, types[tptr], 0);
-                       regalloc(&n3, n2.type, N);
-                       gmove(&n2, &n3);
-                       gcmp(optoas(OCMP, types[tptr]), &n1, &n3);
-                       regfree(&n3);
+                       gcmp(optoas(OCMP, types[tptr]), &n1, &n2);
                        p1 = gbranch(optoas(OEQ, types[tptr]), T, -1);
 
                        n2 = n1;
@@ -370,10 +367,7 @@ cgen(Node *n, Node *res)
                        cgen(nl, &n1);
 
                        nodconst(&n2, types[tptr], 0);
-                       regalloc(&n3, n2.type, N);
-                       gmove(&n2, &n3);
-                       gcmp(optoas(OCMP, types[tptr]), &n1, &n3);
-                       regfree(&n3);
+                       gcmp(optoas(OCMP, types[tptr]), &n1, &n2);
                        p1 = gbranch(optoas(OEQ, types[tptr]), T, -1);
 
                        n2 = n1;