diff options
author | Joel Sing <joel@sing.id.au> | 2020-03-31 02:04:45 +1100 |
---|---|---|
committer | Joel Sing <joel@sing.id.au> | 2020-05-10 14:43:46 +0000 |
commit | 57e32c4fbd4f20d567d1767dfc2d94bec828a8dc (patch) | |
tree | b0524682ed6fc484bace3aafca552a4d78ee6ade /src/cmd/compile/internal/ssa/gen/RISCV64.rules | |
parent | 000636fdb58c9444b17e54977382dc1d6357e8c3 (diff) | |
download | go-57e32c4fbd4f20d567d1767dfc2d94bec828a8dc.tar.gz go-57e32c4fbd4f20d567d1767dfc2d94bec828a8dc.zip |
cmd/compile: optimise branchs on riscv64
Make use of multi-control values and branch pseudo-instructions to optimise
compiler generated branches.
Change-Id: I7a8bf754db3c2082a390bf6a662ccf18cbcbee39
Reviewed-on: https://go-review.googlesource.com/c/go/+/226400
Reviewed-by: Keith Randall <khr@golang.org>
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/cmd/compile/internal/ssa/gen/RISCV64.rules')
-rw-r--r-- | src/cmd/compile/internal/ssa/gen/RISCV64.rules | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/src/cmd/compile/internal/ssa/gen/RISCV64.rules b/src/cmd/compile/internal/ssa/gen/RISCV64.rules index fbd87360ac8..9437c8e9d4b 100644 --- a/src/cmd/compile/internal/ssa/gen/RISCV64.rules +++ b/src/cmd/compile/internal/ssa/gen/RISCV64.rules @@ -445,16 +445,6 @@ (Addr {sym} base) => (MOVaddr {sym} [0] base) (LocalAddr {sym} base _) => (MOVaddr {sym} base) -// Conditional branches -// -// cond is 1 if true. -// -// TODO(prattmic): RISCV branch instructions take two operands to compare, -// so we could generate more efficient code by computing the condition in the -// branch itself. This should be revisited now that the compiler has support -// for two control values (https://golang.org/cl/196557). -(If cond yes no) => (BNEZ cond yes no) - // Calls (StaticCall ...) => (CALLstatic ...) (ClosureCall ...) => (CALLclosure ...) @@ -480,11 +470,31 @@ (AtomicExchange32 ...) => (LoweredAtomicExchange32 ...) (AtomicExchange64 ...) => (LoweredAtomicExchange64 ...) +// Conditional branches +(If cond yes no) => (BNEZ cond yes no) + // Optimizations -// Absorb SNEZ into branch. +// Absorb SEQZ/SNEZ into branch. +(BEQZ (SEQZ x) yes no) => (BNEZ x yes no) +(BEQZ (SNEZ x) yes no) => (BEQZ x yes no) +(BNEZ (SEQZ x) yes no) => (BEQZ x yes no) (BNEZ (SNEZ x) yes no) => (BNEZ x yes no) +// Convert BEQZ/BNEZ into more optimal branch conditions. +(BEQZ (SUB x y) yes no) => (BEQ x y yes no) +(BNEZ (SUB x y) yes no) => (BNE x y yes no) +(BEQZ (SLT x y) yes no) => (BGE x y yes no) +(BNEZ (SLT x y) yes no) => (BLT x y yes no) +(BEQZ (SLTU x y) yes no) => (BGEU x y yes no) +(BNEZ (SLTU x y) yes no) => (BLTU x y yes no) + +// Convert branch with zero to BEQZ/BNEZ. +(BEQ (MOVDconst [0]) cond yes no) => (BEQZ cond yes no) +(BEQ cond (MOVDconst [0]) yes no) => (BEQZ cond yes no) +(BNE (MOVDconst [0]) cond yes no) => (BNEZ cond yes no) +(BNE cond (MOVDconst [0]) yes no) => (BNEZ cond yes no) + // Store zero (MOVBstore [off] {sym} ptr (MOVBconst [0]) mem) => (MOVBstorezero [off] {sym} ptr mem) (MOVHstore [off] {sym} ptr (MOVHconst [0]) mem) => (MOVHstorezero [off] {sym} ptr mem) |