]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: slightly better code generation
authorRuss Cox <rsc@golang.org>
Sun, 3 Feb 2013 19:51:21 +0000 (14:51 -0500)
committerRuss Cox <rsc@golang.org>
Sun, 3 Feb 2013 19:51:21 +0000 (14:51 -0500)
* Avoid treating CALL fn(SB) as justification for introducing
and tracking a registerized variable for fn(SB).

* Remove USED(n) after declaration and zeroing of n.
It was left over from when the compiler emitted more
aggressive set and not used errors, and it was keeping
the optimizer from removing a redundant zeroing of n
when n was a pointer or integer variable.

Update #597.

R=ken2
CC=golang-dev
https://golang.org/cl/7277048

src/cmd/5g/reg.c
src/cmd/6g/reg.c
src/cmd/8g/reg.c
src/cmd/gc/gen.c

index 584ffc253478d361646987dd6d27aff20f01dd8c..da80f32a4b69ba405a8b246349d9a1355a66efd3 100644 (file)
@@ -275,6 +275,10 @@ regopt(Prog *firstp)
                        }
                }
 
+               // Avoid making variables for direct-called functions.
+               if(p->as == ABL && p->to.type == D_EXTERN)
+                       continue;
+
                /*
                 * left side always read
                 */
index 9c9b74d0ed1391ace728b356855fad195086e5bb..bb8e09c6423c8fb4aa65fadfe35bb5f62d5eedc4 100644 (file)
@@ -252,6 +252,10 @@ regopt(Prog *firstp)
                        }
                }
 
+               // Avoid making variables for direct-called functions.
+               if(p->as == ACALL && p->to.type == D_EXTERN)
+                       continue;
+
                // Addressing makes some registers used.
                if(p->from.type >= D_INDIR)
                        r->use1.b[0] |= RtoB(p->from.type-D_INDIR);
index 4e516b82a659dcd7365d2102499acee6f148b4b2..e96336b702ebbf96aec5c8c0620a432d78e37150 100644 (file)
@@ -222,6 +222,10 @@ regopt(Prog *firstp)
                        }
                }
 
+               // Avoid making variables for direct-called functions.
+               if(p->as == ACALL && p->to.type == D_EXTERN)
+                       continue;
+
                // Addressing makes some registers used.
                if(p->from.type >= D_INDIR)
                        r->use1.b[0] |= RtoB(p->from.type-D_INDIR);
index 8114448a105248a26ecf443cc76b87bf3c803e34..335d77db53d8442d3561d65ba964024914e02397 100644 (file)
@@ -735,8 +735,6 @@ cgen_as(Node *nl, Node *nr)
                        return;
                }
                clearslim(nl);
-               if(nl->addable)
-                       gused(nl);
                return;
        }