]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: update WBLoads during deadcode
authorKeith Randall <khr@google.com>
Tue, 29 May 2018 17:30:54 +0000 (10:30 -0700)
committerKeith Randall <khr@golang.org>
Tue, 29 May 2018 17:45:36 +0000 (17:45 +0000)
When we deadcode-remove a block which is a write barrier test,
remove that block from the list of write barrier test blocks.

Fixes #25516

Change-Id: I1efe732d5476003eab4ad6bf67d0340d7874ff0c
Reviewed-on: https://go-review.googlesource.com/115037
Run-TryBot: Keith Randall <khr@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/compile/internal/ssa/deadcode.go
test/fixedbugs/issue25516.go [new file with mode: 0644]

index 322ea82c8d603f6b73b769710bacfd35b264e0e6..13b7d7e1e84a6cff70a086ce83d2426b8aee8585 100644 (file)
@@ -252,6 +252,19 @@ func deadcode(f *Func) {
                b.Values = b.Values[:i]
        }
 
+       // Remove dead blocks from WBLoads list.
+       i = 0
+       for _, b := range f.WBLoads {
+               if reachable[b.ID] {
+                       f.WBLoads[i] = b
+                       i++
+               }
+       }
+       for j := i; j < len(f.WBLoads); j++ {
+               f.WBLoads[j] = nil
+       }
+       f.WBLoads = f.WBLoads[:i]
+
        // Remove unreachable blocks. Return dead blocks to allocator.
        i = 0
        for _, b := range f.Blocks {
diff --git a/test/fixedbugs/issue25516.go b/test/fixedbugs/issue25516.go
new file mode 100644 (file)
index 0000000..8326ef9
--- /dev/null
@@ -0,0 +1,26 @@
+// compile
+
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Make sure dead write barriers are handled correctly.
+
+package main
+
+func f(p **int) {
+       // The trick here is to eliminate the block containing the write barrier,
+       // but only after the write barrier branches are inserted.
+       // This requires some delicate code.
+       i := 0
+       var b []bool
+       var s string
+       for true {
+               if b[i] {
+                       var a []string
+                       s = a[len(s)]
+                       i = 0
+               }
+               *p = nil
+       }
+}