• 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
compile.go 11.1 KB