]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/5g: allow optimization of return registers.
authorShenghou Ma <minux.ma@gmail.com>
Fri, 11 Jan 2013 04:29:14 +0000 (12:29 +0800)
committerShenghou Ma <minux.ma@gmail.com>
Fri, 11 Jan 2013 04:29:14 +0000 (12:29 +0800)
Modeled after CL 7030046 by daniel.morsing.

example program:
func f(x int) int { x -= 10; return x }

5g -S difference:
 --- prog list "f" ---
 0011 (x.go:7) TEXT    add+0(SB),$0-8
 0012 (x.go:7) MOVW    x+0(FP),R0
-0013 (x.go:7) SUB     $10,R0,R2
-0014 (x.go:7) MOVW    R2,R0
-0015 (x.go:7) MOVW    R2,.noname+4(FP)
-0016 (x.go:7) RET     ,
+0013 (x.go:7) SUB     $10,R0
+0014 (x.go:7) MOVW    R0,.noname+4(FP)
+0015 (x.go:7) RET     ,

R=dave, rsc
CC=golang-dev
https://golang.org/cl/7030047

src/cmd/5g/peep.c

index 10551e3c618dac2a1afaaf0cbf1c323720e97dc3..4e35cf75a7414797b205dbc81fbc6b0865a64c07 100644 (file)
@@ -1160,12 +1160,9 @@ copyu(Prog *p, Adr *v, Adr *s)
                return 0;
 
        case ARET:      /* funny */
-               if(v->type == D_REG)
-               if(v->reg == REGRET)
-                       return 2;
-               if(v->type == D_FREG)
-               if(v->reg == FREGRET)
-                       return 2;
+               if(s != A)
+                       return 1;
+               return 3;
 
        case ABL:       /* funny */
                if(v->type == D_REG) {