]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.power64] 9g: fix nilopt
authorAustin Clements <austin@google.com>
Mon, 3 Nov 2014 20:48:51 +0000 (15:48 -0500)
committerAustin Clements <austin@google.com>
Mon, 3 Nov 2014 20:48:51 +0000 (15:48 -0500)
Previously, nilopt was disabled on power64x because it threw
away "seemly random segments of code."  Indeed, excise on
power64x failed to preserve the link field, so it excised not
only the requested instruction but all following instructions
in the function.  Fix excise to retain the link field while
otherwise zeroing the instruction.

This makes nilopt safe on power64x.  It still fails
nilptr3.go's tests for removal of repeated nil checks because
those depend on also optimizing away repeated loads, which
doesn't currently happen on power64x.

LGTM=dave, rsc
R=rsc, dave
CC=golang-codereviews
https://golang.org/cl/168120043

src/cmd/9g/peep.c
src/cmd/gc/popt.c

index 5721d7b04ffb115503019847c5b70d83bc04d04e..ec314d6338ee8880e86c2913bd047ef65ff11dbb 100644 (file)
@@ -44,13 +44,15 @@ peep(Prog *p)
 void
 excise(Flow *r)
 {
-       Prog *p;
+       Prog *p, *l;
 
        p = r->prog;
        if(debug['P'] && debug['v'])
                print("%P ===delete===\n", p);
+       l = p->link;
        *p = zprog;
        p->as = ANOP;
+       p->link = l;
        ostats.ndelmov++;
 }
 
index 6e6db88ef86daac315da0f204de74ea7f8d4cf56..993bb24821d21b59d56ce809ac23d2e9cad49573 100644 (file)
@@ -847,10 +847,6 @@ nilopt(Prog *firstp)
        Graph *g;
        int ncheck, nkill;
 
-       // TODO(minux): nilopt on power64 throw away seemly random segment of code.
-       if(thechar == '9')
-               return;
-
        g = flowstart(firstp, sizeof(NilFlow));
        if(g == nil)
                return;