]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: free value earlier in nilcheck
authorKeith Randall <khr@golang.org>
Thu, 24 Aug 2017 23:11:44 +0000 (16:11 -0700)
committerKeith Randall <khr@golang.org>
Fri, 25 Aug 2017 06:01:26 +0000 (06:01 +0000)
When we remove a nil check, add it back to the free Value pool immediately.

Fixes #18732

Change-Id: I8d644faabbfb52157d3f2d071150ff0342ac28dc
Reviewed-on: https://go-review.googlesource.com/58810
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
src/cmd/compile/internal/ssa/func.go
src/cmd/compile/internal/ssa/nilcheck.go
src/cmd/compile/internal/ssa/regalloc.go

index 7ec596372adeb24d981b12479b88702ee5aafd79..559f1d70e6f1024a2ee5c96b00bb0497d9fe49f1 100644 (file)
@@ -175,7 +175,7 @@ func (f *Func) LogStat(key string, args ...interface{}) {
        f.Warnl(f.Entry.Pos, "\t%s\t%s%s\t%s", n, key, value, f.Name)
 }
 
-// freeValue frees a value. It must no longer be referenced.
+// freeValue frees a value. It must no longer be referenced or have any args.
 func (f *Func) freeValue(v *Value) {
        if v.Block == nil {
                f.Fatalf("trying to free an already freed value")
@@ -183,6 +183,9 @@ func (f *Func) freeValue(v *Value) {
        if v.Uses != 0 {
                f.Fatalf("value %s still has %d uses", v, v.Uses)
        }
+       if len(v.Args) != 0 {
+               f.Fatalf("value %s still has %d args", v, len(v.Args))
+       }
        // Clear everything but ID (which we reuse).
        id := v.ID
 
index d01edcc77d5f32c26202d5ede54296819ec38100..f8c7a5019cb11b3902bbc2f1b8cf23ad667183de 100644 (file)
@@ -126,7 +126,7 @@ func nilcheckelim(f *Func) {
                                                        f.Warnl(v.Pos, "removed nil check")
                                                }
                                                v.reset(OpUnknown)
-                                               // TODO: f.freeValue(v)
+                                               f.freeValue(v)
                                                i--
                                                continue
                                        }
index 35d1d6ea9e53039b79e2006bba9538c5d0298f4e..d509c6c0d372b471f8d1773e3ca4e4d346103f16 100644 (file)
@@ -1569,7 +1569,7 @@ func (s *regAllocState) regalloc(f *Func) {
                                if s.f.pass.debug > regDebug {
                                        fmt.Printf("delete copied value %s\n", c.LongString())
                                }
-                               c.Args[0].Uses--
+                               c.RemoveArg(0)
                                f.freeValue(c)
                                delete(s.copies, c)
                                progress = true