Commit 6b0941a1 authored by Keith Randall's avatar Keith Randall

cmd/compile: remove unnecessary convert ops on 32-bit archs

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/112158Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: default avatarDavid Chase <drchase@google.com>
parent dffc915b
......@@ -859,7 +859,7 @@
(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
......
......@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment