[dev.ssa] cmd/compile: get rid of converts in unsafe.Pointer arithmetic

unsafe.Pointer->uintptr, add, then uintptr->unsafe.Pointer.
Do the add directly on the pointer type instead.

Change-Id: I5a3a32691d0a000e16975857974ed9a1039c6d28
Reviewed-on: https://go-review.googlesource.com/16281
Run-TryBot: Keith Randall <khr@golang.org>
Reviewed-by: David Chase <drchase@google.com>
diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go
index 7f9c855..91427e2 100644
--- a/src/cmd/compile/internal/ssa/rewritegeneric.go
+++ b/src/cmd/compile/internal/ssa/rewritegeneric.go
@@ -354,6 +354,30 @@
 		goto end2eb756398dd4c6b6d126012a26284c89
 	end2eb756398dd4c6b6d126012a26284c89:
 		;
+	case OpConvert:
+		// match: (Convert (Add64 (Convert ptr) off))
+		// cond:
+		// result: (Add64 ptr off)
+		{
+			if v.Args[0].Op != OpAdd64 {
+				goto end913a7ecf456c00ffbee36c2dbbf0e1af
+			}
+			if v.Args[0].Args[0].Op != OpConvert {
+				goto end913a7ecf456c00ffbee36c2dbbf0e1af
+			}
+			ptr := v.Args[0].Args[0].Args[0]
+			off := v.Args[0].Args[1]
+			v.Op = OpAdd64
+			v.AuxInt = 0
+			v.Aux = nil
+			v.resetArgs()
+			v.AddArg(ptr)
+			v.AddArg(off)
+			return true
+		}
+		goto end913a7ecf456c00ffbee36c2dbbf0e1af
+	end913a7ecf456c00ffbee36c2dbbf0e1af:
+		;
 	case OpEq16:
 		// match: (Eq16 x x)
 		// cond: