• David Chase's avatar
    [dev.ssa] cmd/compile: adjust branch likeliness for calls/loops · 6b3462c7
    David Chase authored
    Static branch predictions (which guide block ordering) are
    adjusted based on:
    
    loop/not-loop     (favor looping)
    abnormal-exit/not (avoid panic)
    call/not-call     (avoid call)
    ret/default       (treat returns as rare)
    
    This appears to make no difference in performance of real
    code, meaning the compiler itself.  The earlier version of
    this has been stripped down to help make the cost of this
    only-aesthetic-on-Intel phase be as cheap as possible (we
    probably want information about inner loops for improving
    register allocation, but because register allocation follows
    close behind this pass, conceivably the information could be
    reused -- so we might do this anyway just to normalize
    output).
    
    For a ./make.bash that takes 200 user seconds, about .75
    second is reported in likelyadjust (summing nanoseconds
    reported with -d=ssa/likelyadjust/time ).
    
    Upstream predictions are respected.
    Includes test, limited to build on amd64 only.
    Did several iterations on the debugging output to allow
    some rough checks on behavior.
    Debug=1 logging notes agree/disagree with earlier passes,
    allowing analysis like the following:
    
    Run on make.bash:
    GO_GCFLAGS=-d=ssa/likelyadjust/debug \
       ./make.bash >& lkly5.log
    
    grep 'ranch prediction' lkly5.log | wc -l
       78242 // 78k predictions
    
    grep 'ranch predi' lkly5.log | egrep -v 'agrees with' | wc -l
       29633 // 29k NEW predictions
    
    grep 'disagrees' lkly5.log | wc -l
         444 // contradicted 444 times
    
    grep '< exit' lkly5.log | wc -l
       10212 // 10k exit predictions
    
    grep '< exit' lkly5.log | egrep 'disagrees' | wc -l
           5 // 5 contradicted by previous prediction
    
    grep '< exit' lkly5.log | egrep -v 'agrees' | wc -l
         702 // 702-5 redundant with previous prediction
    
    grep '< call' lkly5.log | egrep -v 'agrees' | wc -l
       16699 // 16k new call predictions
    
    grep 'stay in loop' lkly5.log | egrep -v 'agrees' | wc -l
        3951 // 4k new "remain in loop" predictions
    
    Fixes #11451.
    
    Change-Id: Iafb0504f7030d304ef4b6dc1aba9a5789151a593
    Reviewed-on: https://go-review.googlesource.com/19995
    Run-TryBot: David Chase <drchase@google.com>
    Reviewed-by: default avatarKeith Randall <khr@golang.org>
    6b3462c7
opt_branchlikely.go 1.94 KB