summaryrefslogtreecommitdiff
path: root/test/codegen/compare_and_branch.go
Commit message (Collapse)AuthorAgeFilesLines
* cmd/compile: optimize comparisons with immediates on s390xMichael Munday2020-04-211-0/+52
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When generating code for unsigned equals (==) and not equals (!=) comparisons we currently, on s390x, always use signed comparisons. This mostly works well, however signed comparisons on s390x sign extend their immediates and unsigned comparisons zero extend them. For compare-and-branch instructions which can only have 8-bit immediates this significantly changes the range of immediate values we can represent: [-128, 127] for signed comparisons and [0, 255] for unsigned comparisons. When generating equals and not equals checks we don't neet to worry about whether the comparison is signed or unsigned. This CL therefore adds rules to allow us to switch signedness for such comparisons if it means that it brings a constant into range for an 8-bit immediate. For example, a signed equals with an integer in the range [128, 255] will now be implemented using an unsigned compare-and-branch instruction rather than separate compare and branch instructions. As part of this change I've also added support for adding a name to block control values using the same `x:(...)` syntax we use for value rules. Triggers 792 times when compiling cmd and std. Change-Id: I77fa80a128f0a8ce51a2888d1e384bd5e9b61a77 Reviewed-on: https://go-review.googlesource.com/c/go/+/228642 Run-TryBot: Michael Munday <mike.munday@ibm.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
* cmd/compile: canonicalize comparison argument orderMichael Munday2020-02-261-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Ensure that any comparison between two values has the same argument order. This helps ensure that they can be eliminated during the lowered CSE pass which will be particularly important if we eliminate the Greater and Geq ops (see #37316). Example: CMP R0, R1 BLT L1 CMP R1, R0 // different order, cannot eliminate BEQ L2 CMP R0, R1 BLT L1 CMP R0, R1 // same order, can eliminate BEQ L2 This does have some drawbacks. Notably comparisons might 'flip' direction in the assembly output after even small changes to the code or compiler. It should help make optimizations more reliable however. compilecmp master -> HEAD master (218f4572f5): text/template: make reflect.Value indirections more robust HEAD (f1661fef3e): cmd/compile: canonicalize comparison argument order platform: linux/amd64 file before after Δ % api 6063927 6068023 +4096 +0.068% asm 5191757 5183565 -8192 -0.158% cgo 4893518 4901710 +8192 +0.167% cover 5330345 5326249 -4096 -0.077% fix 3417778 3421874 +4096 +0.120% pprof 14889456 14885360 -4096 -0.028% test2json 2848138 2844042 -4096 -0.144% trace 11746239 11733951 -12288 -0.105% total 132739173 132722789 -16384 -0.012% Change-Id: I11736b3fe2a4553f6fc65018f475e88217fa22f9 Reviewed-on: https://go-review.googlesource.com/c/go/+/220425 Run-TryBot: Michael Munday <mike.munday@ibm.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
* cmd/compile: add SSA rules for s390x compare-and-branch instructionsMichael Munday2019-10-081-0/+154
This commit adds SSA rules for the s390x combined compare-and-branch instructions. These have a shorter encoding than separate compare and branch instructions and they also don't clobber the condition code (a.k.a. flag register) reducing pressure on the flag allocator. I have deleted the 'loop_test.go' file and replaced it with a new codegen test which performs a wider range of checks. Object sizes from compilebench: name old object-bytes new object-bytes delta Template 562kB ± 0% 561kB ± 0% -0.28% (p=0.000 n=10+10) Unicode 217kB ± 0% 217kB ± 0% -0.17% (p=0.000 n=10+10) GoTypes 2.03MB ± 0% 2.02MB ± 0% -0.59% (p=0.000 n=10+10) Compiler 8.16MB ± 0% 8.11MB ± 0% -0.62% (p=0.000 n=10+10) SSA 27.4MB ± 0% 27.0MB ± 0% -1.45% (p=0.000 n=10+10) Flate 356kB ± 0% 356kB ± 0% -0.12% (p=0.000 n=10+10) GoParser 438kB ± 0% 436kB ± 0% -0.51% (p=0.000 n=10+10) Reflect 1.37MB ± 0% 1.37MB ± 0% -0.42% (p=0.000 n=10+10) Tar 485kB ± 0% 483kB ± 0% -0.39% (p=0.000 n=10+10) XML 630kB ± 0% 621kB ± 0% -1.45% (p=0.000 n=10+10) [Geo mean] 1.14MB 1.13MB -0.60% name old text-bytes new text-bytes delta HelloSize 763kB ± 0% 754kB ± 0% -1.30% (p=0.000 n=10+10) CmdGoSize 10.7MB ± 0% 10.6MB ± 0% -0.91% (p=0.000 n=10+10) [Geo mean] 2.86MB 2.82MB -1.10% Change-Id: Ibca55d9c0aa1254aee69433731ab5d26a43a7c18 Reviewed-on: https://go-review.googlesource.com/c/go/+/198037 Run-TryBot: Michael Munday <mike.munday@ibm.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>