aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAustin Clements <austin@google.com>2014-11-03 15:48:51 -0500
committerAustin Clements <austin@google.com>2014-11-03 15:48:51 -0500
commit810019286fdb8ad6b60096f2b0e2dcf0bc900c3a (patch)
treeb59e71965ef5f5e9f2ba3fc023246da16dc71a67
parent31b1207fde70531cd5092d83c01ad5e0f07eb951 (diff)
downloadgo-810019286fdb8ad6b60096f2b0e2dcf0bc900c3a.tar.gz
go-810019286fdb8ad6b60096f2b0e2dcf0bc900c3a.zip
[dev.power64] 9g: fix nilopt
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
-rw-r--r--src/cmd/9g/peep.c4
-rw-r--r--src/cmd/gc/popt.c4
2 files changed, 3 insertions, 5 deletions
diff --git a/src/cmd/9g/peep.c b/src/cmd/9g/peep.c
index 5721d7b04f..ec314d6338 100644
--- a/src/cmd/9g/peep.c
+++ b/src/cmd/9g/peep.c
@@ -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++;
}
diff --git a/src/cmd/gc/popt.c b/src/cmd/gc/popt.c
index 6e6db88ef8..993bb24821 100644
--- a/src/cmd/gc/popt.c
+++ b/src/cmd/gc/popt.c
@@ -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;