• Ilya Tocar's avatar
    cmd/compile/internal/ssa: update regalloc in loops · 983dcf70
    Ilya Tocar authored
    Currently we don't lift spill out of loop if loop contains call.
    However often we have code like this:
    
    for .. {
        if hard_case {
    	call()
        }
        // simple case, without call
    }
    
    So instead of checking for any call, check for unavoidable call.
    For #22698 cases I see:
    mime/quotedprintable/Writer-6                   10.9µs ± 4%      9.2µs ± 3%   -15.02%  (p=0.000 n=8+8)
    And:
    compress/flate/Encode/Twain/Huffman/1e4-6       99.4µs ± 6%     90.9µs ± 0%    -8.57%  (p=0.000 n=8+8)
    compress/flate/Encode/Twain/Huffman/1e5-6       760µs ± 1%      725µs ± 1%     -4.56%  (p=0.000 n=8+8)
    compress/flate/Encode/Twain/Huffman/1e6-6       7.55ms ± 0%      7.24ms ± 0%     -4.07%  (p=0.000 n=8+7)
    
    There are no significant changes on go1 benchmarks.
    But for cases with runtime arch checks, where we call generic version on old hardware,
    there are respectable performance gains:
    math/RoundToEven-6                             1.43ns ± 0%     1.25ns ± 0%   -12.59%  (p=0.001 n=7+7)
    math/bits/OnesCount64-6                        1.60ns ± 1%     1.42ns ± 1%   -11.32%  (p=0.000 n=8+8)
    
    Also on some runtime benchmarks loops have less loads and higher performance:
    runtime/RuneIterate/range1/ASCII-6             15.6ns ± 1%     13.9ns ± 1%   -10.74%  (p=0.000 n=7+8)
    runtime/ArrayEqual-6                           3.22ns ± 0%     2.86ns ± 2%   -11.06%  (p=0.000 n=7+8)
    
    Fixes #22698
    Updates #22234
    
    Change-Id: I0ae2f19787d07a9026f064366dedbe601bf7257a
    Reviewed-on: https://go-review.googlesource.com/84055
    Run-TryBot: Ilya Tocar <ilya.tocar@intel.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarDavid Chase <drchase@google.com>
    983dcf70
likelyadjust.go 15.2 KB