]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.ssa] cmd/compile/internal/ssa: simplify convert in more cases
authorAlexandru Moșoi <mosoi@google.com>
Tue, 23 Feb 2016 20:48:33 +0000 (21:48 +0100)
committerAlexandru Moșoi <alexandru@mosoi.ro>
Wed, 24 Feb 2016 07:39:01 +0000 (07:39 +0000)
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>
src/cmd/compile/internal/ssa/gen/generic.rules
src/cmd/compile/internal/ssa/rewritegeneric.go

index 4d4310555731673fc48fc6698984e2940aaf84c7..ac243379205458bb7e4e60ae77941fb55ba8322a 100644 (file)
 
 // Get rid of Convert ops for pointer arithmetic on unsafe.Pointer.
 (Convert (Add64 (Convert ptr mem) off) mem) -> (Add64 ptr off)
+(Convert (Add64 off (Convert ptr mem)) mem) -> (Add64 ptr off)
 (Convert (Convert ptr mem) mem) -> ptr
 
 // Decompose compound argument values
index 7916c6d8f412caac23a48853be15bac0a0a1616f..08ab2e14a6288457b64a6debd5194f8149f0d187 100644 (file)
@@ -1428,6 +1428,27 @@ func rewriteValuegeneric_OpConvert(v *Value, config *Config) bool {
                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