]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: remove unnecessary convert ops on 32-bit archs
authorKeith Randall <khr@golang.org>
Tue, 8 May 2018 15:53:21 +0000 (08:53 -0700)
committerKeith Randall <khr@golang.org>
Tue, 8 May 2018 19:16:04 +0000 (19:16 +0000)
Missing rule to fold out Convert ops on 32-bit architectures.

This comes up with expressions like
unsafe.Pointer(uintptr(p) + x)

Change-Id: I429e968e5d1a3e13a386ddd29a08ebb6d7dd938a
Reviewed-on: https://go-review.googlesource.com/112158
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: David Chase <drchase@google.com>
src/cmd/compile/internal/ssa/gen/generic.rules
src/cmd/compile/internal/ssa/rewritegeneric.go

index 0f11b2ef50ababec87c0ddb4253faec8c15433bb..6225f1ebc88258461fe39bd4273aa2fcc76f2d55 100644 (file)
 (If (ConstBool [c]) yes no) && c == 0 -> (First nil no yes)
 
 // Get rid of Convert ops for pointer arithmetic on unsafe.Pointer.
-(Convert (Add64 (Convert ptr mem) off) mem) -> (Add64 ptr off)
+(Convert (Add(64|32) (Convert ptr mem) off) mem) -> (Add(64|32) ptr off)
 (Convert (Convert ptr mem) mem) -> ptr
 
 // Decompose compound argument values
index 5bfad8e05b9f76bf7b3f7d1a3ed3e3334a4006dc..1f89b2156ec41b6d8cd2fcef19028eebd38f555e 100644 (file)
@@ -7489,6 +7489,58 @@ func rewriteValuegeneric_OpConvert_0(v *Value) bool {
                v.AddArg(off)
                return true
        }
+       // match: (Convert (Add32 (Convert ptr mem) off) mem)
+       // cond:
+       // result: (Add32 ptr off)
+       for {
+               _ = v.Args[1]
+               v_0 := v.Args[0]
+               if v_0.Op != OpAdd32 {
+                       break
+               }
+               _ = v_0.Args[1]
+               v_0_0 := v_0.Args[0]
+               if v_0_0.Op != OpConvert {
+                       break
+               }
+               _ = v_0_0.Args[1]
+               ptr := v_0_0.Args[0]
+               mem := v_0_0.Args[1]
+               off := v_0.Args[1]
+               if mem != v.Args[1] {
+                       break
+               }
+               v.reset(OpAdd32)
+               v.AddArg(ptr)
+               v.AddArg(off)
+               return true
+       }
+       // match: (Convert (Add32 off (Convert ptr mem)) mem)
+       // cond:
+       // result: (Add32 ptr off)
+       for {
+               _ = v.Args[1]
+               v_0 := v.Args[0]
+               if v_0.Op != OpAdd32 {
+                       break
+               }
+               _ = v_0.Args[1]
+               off := v_0.Args[0]
+               v_0_1 := v_0.Args[1]
+               if v_0_1.Op != OpConvert {
+                       break
+               }
+               _ = v_0_1.Args[1]
+               ptr := v_0_1.Args[0]
+               mem := v_0_1.Args[1]
+               if mem != v.Args[1] {
+                       break
+               }
+               v.reset(OpAdd32)
+               v.AddArg(ptr)
+               v.AddArg(off)
+               return true
+       }
        // match: (Convert (Convert ptr mem) mem)
        // cond:
        // result: ptr