From: philhofer Date: Tue, 15 Aug 2017 04:50:43 +0000 (-0700) Subject: cmd/compile: omit unnecessary boolean zero extension on arm64 X-Git-Tag: go1.10beta1~1431 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=07ec4385f16ad5d10933f4540624aba8b48b1891;p=gostls13.git cmd/compile: omit unnecessary boolean zero extension on arm64 On arm64, all boolean-generating instructions (CSET, etc.) set the upper 63 bits of the destination register to zero, so there is no need to zero-extend the lower 8 bits again. Fixes #21445 Change-Id: I3b176baab706eb684105400bacbaa24175f721f3 Reviewed-on: https://go-review.googlesource.com/55671 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- diff --git a/src/cmd/compile/internal/ssa/gen/ARM64.rules b/src/cmd/compile/internal/ssa/gen/ARM64.rules index 2c51b5e01b..f13541068e 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64.rules +++ b/src/cmd/compile/internal/ssa/gen/ARM64.rules @@ -1033,6 +1033,10 @@ (GreaterEqual (InvertFlags x)) -> (LessEqual x) (GreaterEqualU (InvertFlags x)) -> (LessEqualU x) +// Boolean-generating instructions always +// zero upper bit of the register; no need to zero-extend +(MOVBUreg x) && x.Type.IsBoolean() -> (MOVDreg x) + // absorb flag constants into conditional instructions (CSELULT _ y (FlagEQ)) -> y (CSELULT x _ (FlagLT_ULT)) -> x diff --git a/src/cmd/compile/internal/ssa/rewriteARM64.go b/src/cmd/compile/internal/ssa/rewriteARM64.go index 15f1d70a6d..f87c5521bb 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM64.go +++ b/src/cmd/compile/internal/ssa/rewriteARM64.go @@ -3790,6 +3790,18 @@ func rewriteValueARM64_OpARM64MOVBUreg_0(v *Value) bool { v.AuxInt = int64(uint8(c)) return true } + // match: (MOVBUreg x) + // cond: x.Type.IsBoolean() + // result: (MOVDreg x) + for { + x := v.Args[0] + if !(x.Type.IsBoolean()) { + break + } + v.reset(OpARM64MOVDreg) + v.AddArg(x) + return true + } return false } func rewriteValueARM64_OpARM64MOVBload_0(v *Value) bool {