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>
(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
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