{name: "late opt", fn: opt, required: true}, // TODO: split required rules and optimizing rules
{name: "generic deadcode", fn: deadcode},
{name: "check bce", fn: checkbce},
- {name: "writebarrier", fn: writebarrier, required: true}, // expand write barrier ops
{name: "fuse", fn: fuse},
{name: "dse", fn: dse},
+ {name: "writebarrier", fn: writebarrier, required: true}, // expand write barrier ops
{name: "insert resched checks", fn: insertLoopReschedChecks,
disabled: objabi.Preemptibleloops_enabled == 0}, // insert resched checks in loops.
{name: "tighten", fn: tighten}, // move values closer to their uses
import "unsafe"
func f(x **byte, y *byte) {
- *x = y // ERROR "write barrier"
+ *x = y // no barrier (dead store)
z := y // no barrier
*x = z // ERROR "write barrier"
}
func f1(x *[]byte, y []byte) {
- *x = y // ERROR "write barrier"
+ *x = y // no barrier (dead store)
z := y // no barrier
*x = z // ERROR "write barrier"
}
func f2(x *interface{}, y interface{}) {
- *x = y // ERROR "write barrier"
+ *x = y // no barrier (dead store)
z := y // no barrier
*x = z // ERROR "write barrier"
}
func f2a(x *interface{}, y *interface{}) {
- *x = *y // ERROR "write barrier"
+ *x = *y // no barrier (dead store)
z := y // no barrier
*x = z // ERROR "write barrier"
}
func f3(x *string, y string) {
- *x = y // ERROR "write barrier"
+ *x = y // no barrier (dead store)
z := y // no barrier
*x = z // ERROR "write barrier"
}
var z21 int
-func f21(x *int) {
- // Global -> heap pointer updates must have write barriers.
- x21 = x // ERROR "write barrier"
- y21.x = x // ERROR "write barrier"
- x21 = &z21 // ERROR "write barrier"
- y21.x = &z21 // ERROR "write barrier"
+// f21x: Global -> heap pointer updates must have write barriers.
+func f21a(x *int) {
+ x21 = x // ERROR "write barrier"
+ y21.x = x // ERROR "write barrier"
+}
+
+func f21b(x *int) {
+ x21 = &z21 // ERROR "write barrier"
+ y21.x = &z21 // ERROR "write barrier"
+}
+
+func f21c(x *int) {
y21 = struct{ x *int }{x} // ERROR "write barrier"
}
var t23 T23
var i23 int
-func f23() {
- // zeroing global needs write barrier for the hybrid barrier.
+// f23x: zeroing global needs write barrier for the hybrid barrier.
+func f23a() {
t23 = T23{} // ERROR "write barrier"
// also test partial assignments
- t23 = T23{a: 1} // ERROR "write barrier"
+ t23 = T23{a: 1} // ERROR "write barrier"
+}
+
+func f23b() {
+ t23 = T23{} // no barrier (dead store)
+ // also test partial assignments
t23 = T23{p: &i23} // ERROR "write barrier"
}