diff --git a/src/cmd/internal/gc/cgen.go b/src/cmd/internal/gc/cgen.go
index 6c8f7b56a8001514d9d799b99e15bea4c9e70793..d24db5ff683fbe1d23df7b924af1f344063a6eac 100644
--- a/src/cmd/internal/gc/cgen.go
+++ b/src/cmd/internal/gc/cgen.go
@@ -804,7 +804,7 @@ func cgen_wbptr(n, res *Node) {
 	}
 
 	Thearch.Gins(Thearch.Optoas(OCMP, Types[TUINT8]), syslook("writeBarrierEnabled", 0), Nodintconst(0))
-	pbr := Gbranch(Thearch.Optoas(ONE, Types[TUINT32]), nil, -1)
+	pbr := Gbranch(Thearch.Optoas(ONE, Types[TUINT8]), nil, -1)
 	Thearch.Gins(Thearch.Optoas(OAS, Types[Tptr]), &src, &dst)
 	pjmp := Gbranch(obj.AJMP, nil, 0)
 	Patch(pbr, Pc)
@@ -861,13 +861,14 @@ func cgen_wbfat(n, res *Node) {
 	p2.To = p.To
 	p2.To.Offset += int64(Widthptr)
 	Regfree(&dst)
-	Regfree(&src)
 	if needType {
-		p3 := Thearch.Gins(Thearch.Optoas(OAS, Types[Tptr]), typename(n.Type), nil)
+		src.Type = Types[Tptr]
+		Thearch.Gins(Thearch.Optoas(OAS, Types[Tptr]), typename(n.Type), &src)
+		p3 := Thearch.Gins(Thearch.Optoas(OAS, Types[Tptr]), &src, nil)
 		p3.To = p2.To
 		p3.To.Offset -= 2 * int64(Widthptr)
-		Regfree(&src)
 	}
+	Regfree(&src)
 	Ginscall(writebarrierfn(funcName, Types[Tptr], Types[Tptr]), 0)
 }
 
diff --git a/src/cmd/internal/gc/walk.go b/src/cmd/internal/gc/walk.go
index 01319a771f8f312f086f5814daf8cfe1579c00d4..bc886d9eef416fa7f945ca147befa9f977662bd9 100644
--- a/src/cmd/internal/gc/walk.go
+++ b/src/cmd/internal/gc/walk.go
@@ -2218,14 +2218,18 @@ func applywritebarrier(n *Node, init **NodeList) *Node {
 		if Curfn != nil && Curfn.Func.Nowritebarrier {
 			Yyerror("write barrier prohibited")
 		}
-		t := n.Left.Type
-		if t.Width == int64(Widthptr) {
+		if flag_race == 0 {
+			if Debug_wb > 1 {
+				Warnl(int(n.Lineno), "marking %v for barrier", Nconv(n.Left, 0))
+			}
 			n.Op = OASWB
 			return n
 		}
+		// Use slow path always for race detector.
 		if Debug_wb > 0 {
 			Warnl(int(n.Lineno), "write barrier")
 		}
+		t := n.Left.Type
 		l := Nod(OADDR, n.Left, nil)
 		l.Etype = 1 // addr does not escape
 		if t.Width == int64(Widthptr) {