[dev.ssa] cmd/compile/internal/ssa: simplify convert in more cases

Saves about 2k for binaries in pkg/tool/linux_amd64.
Also useful when opt runs after cse (as in 12960) which reorders
arguments for commutative operations such as Add64.

Change-Id: I49ad53afa53db9736bd35c425f4fb35fb511fd63
Reviewed-on: https://go-review.googlesource.com/19827
Run-TryBot: Alexandru Moșoi <alexandru@mosoi.ro>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go
index 7916c6d..08ab2e1 100644
--- a/src/cmd/compile/internal/ssa/rewritegeneric.go
+++ b/src/cmd/compile/internal/ssa/rewritegeneric.go
@@ -1428,6 +1428,27 @@
 		v.AddArg(off)
 		return true
 	}
+	// match: (Convert (Add64 off (Convert ptr mem)) mem)
+	// cond:
+	// result: (Add64 ptr off)
+	for {
+		if v.Args[0].Op != OpAdd64 {
+			break
+		}
+		off := v.Args[0].Args[0]
+		if v.Args[0].Args[1].Op != OpConvert {
+			break
+		}
+		ptr := v.Args[0].Args[1].Args[0]
+		mem := v.Args[0].Args[1].Args[1]
+		if v.Args[1] != mem {
+			break
+		}
+		v.reset(OpAdd64)
+		v.AddArg(ptr)
+		v.AddArg(off)
+		return true
+	}
 	// match: (Convert (Convert ptr mem) mem)
 	// cond:
 	// result: ptr