aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cmd/compile/internal/ssa/writebarrier.go3
-rw-r--r--test/writebarrier.go14
2 files changed, 17 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/ssa/writebarrier.go b/src/cmd/compile/internal/ssa/writebarrier.go
index 419d91d0d3..d7510965f6 100644
--- a/src/cmd/compile/internal/ssa/writebarrier.go
+++ b/src/cmd/compile/internal/ssa/writebarrier.go
@@ -552,6 +552,9 @@ func IsStackAddr(v *Value) bool {
// IsGlobalAddr reports whether v is known to be an address of a global (or nil).
func IsGlobalAddr(v *Value) bool {
+ for v.Op == OpOffPtr || v.Op == OpAddPtr || v.Op == OpPtrIndex || v.Op == OpCopy {
+ v = v.Args[0]
+ }
if v.Op == OpAddr && v.Args[0].Op == OpSB {
return true // address of a global
}
diff --git a/test/writebarrier.go b/test/writebarrier.go
index dbf0b6dde2..1b30fa509e 100644
--- a/test/writebarrier.go
+++ b/test/writebarrier.go
@@ -289,3 +289,17 @@ func f27(p *int) []interface{} {
p, // ERROR "write barrier"
}
}
+
+var g28 [256]uint64
+
+func f28() []interface{} {
+ return []interface{}{
+ false, // no write barrier
+ true, // no write barrier
+ 0, // no write barrier
+ 1, // no write barrier
+ uint8(127), // no write barrier
+ int8(-4), // no write barrier
+ &g28[5], // no write barrier
+ }
+}