• Keith Randall's avatar
    cmd/compile: move phi args which are constants closer to the phi · 305a0ac1
    Keith Randall authored
    entry:
       x = MOVQconst [7]
       ...
    b1:
       goto b2
    b2:
       v = Phi(x, y, z)
    
    Transform that program to:
    
    entry:
       ...
    b1:
       x = MOVQconst [7]
       goto b2
    b2:
       v = Phi(x, y, z)
    
    This CL moves constant-generating instructions used by a phi to the
    appropriate immediate predecessor of the phi's block.
    
    We used to put all constants in the entry block.  Unfortunately, in
    large functions we have lots of constants at the start of the
    function, all of which are used by lots of phis throughout the
    function.  This leads to the constants being live through most of the
    function (especially if there is an outer loop).  That's an O(n^2)
    problem.
    
    Note that most of the non-phi uses of constants have already been
    folded into instructions (ADDQconst, MOVQstoreconst, etc.).
    
    This CL may be generally useful for other instances of compiler
    slowness, I'll have to check.  It may cause some programs to run
    slower, but probably not by much, as rematerializeable values like
    these constants are allocated late (not at their originally scheduled
    location) anyway.
    
    This CL is definitely a minimal change that can be considered for 1.7.
    We probably want to do a better job in the tighten pass generally, not
    just for phi args.  Leaving that for 1.8.
    
    Update #16407
    
    Change-Id: If112a8883b4ef172b2f37dea13e44bda9346c342
    Reviewed-on: https://go-review.googlesource.com/25046
    Run-TryBot: Keith Randall <khr@golang.org>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarJosh Bleecher Snyder <josharian@gmail.com>
    305a0ac1
Name
Last commit
Last update
..
archive Loading commit data...
bufio Loading commit data...
builtin Loading commit data...
bytes Loading commit data...
cmd Loading commit data...
compress Loading commit data...
container Loading commit data...
context Loading commit data...
crypto Loading commit data...
database/sql Loading commit data...
debug Loading commit data...
encoding Loading commit data...
errors Loading commit data...
expvar Loading commit data...
flag Loading commit data...
fmt Loading commit data...
go Loading commit data...
hash Loading commit data...
html Loading commit data...
image Loading commit data...
index/suffixarray Loading commit data...
internal Loading commit data...
io Loading commit data...
log Loading commit data...
math Loading commit data...
mime Loading commit data...
net Loading commit data...
os Loading commit data...
path Loading commit data...
reflect Loading commit data...
regexp Loading commit data...
runtime Loading commit data...
sort Loading commit data...
strconv Loading commit data...
strings Loading commit data...
sync Loading commit data...
syscall Loading commit data...
testing Loading commit data...
text Loading commit data...
time Loading commit data...
unicode Loading commit data...
unsafe Loading commit data...
vendor/golang_org/x/net Loading commit data...
Make.dist Loading commit data...
all.bash Loading commit data...
all.bat Loading commit data...
all.rc Loading commit data...
androidtest.bash Loading commit data...
bootstrap.bash Loading commit data...
buildall.bash Loading commit data...
clean.bash Loading commit data...
clean.bat Loading commit data...
clean.rc Loading commit data...
cmp.bash Loading commit data...
iostest.bash Loading commit data...
make.bash Loading commit data...
make.bat Loading commit data...
make.rc Loading commit data...
naclmake.bash Loading commit data...
nacltest.bash Loading commit data...
race.bash Loading commit data...
race.bat Loading commit data...
run.bash Loading commit data...
run.bat Loading commit data...
run.rc Loading commit data...