Skip to content
  • Michal Terepeta's avatar
    CmmPipeline: add a second pass of CmmCommonBlockElim · d5c4d46a
    Michal Terepeta authored and Ben Gamari's avatar Ben Gamari committed
    
    
    The sinking pass often gets rid of unnecessary registers
    registers/assignements exposing more opportunities for CBE, so this
    commit adds a second round of CBE after the sinking pass and should
    fix #12915 (and some examples in #14226).
    
    Nofib results:
    * Binary size:         0.9% reduction on average
    * Compile allocations: 0.7% increase on average
    * Runtime:             noisy, two separate runs of nofib showed a tiny
                           reduction on average, (~0.2-0.3%), but I think
                           this is mostly noise
    * Compile time:        very noisy, but generally within +/- 0.5% (one
                           run faster, one slower)
    
    One interesting part of this change is that running CBE invalidates
    results of proc-point analysis. But instead of re-doing the whole
    analysis, we can use the map that CBE creates for replacing/comparing
    block labels (maps a redundant label to a useful one) to update the
    results of proc-point analysis. This lowers the overhead compared to the
    previous experiment in #12915.
    
    Signed-off-by: default avatarMichal Terepeta <michal.terepeta@gmail.com>
    
    Test Plan: ./validate
    
    Reviewers: bgamari, simonmar
    
    Reviewed By: simonmar
    
    Subscribers: rwbarton, thomie, carter
    
    GHC Trac Issues: #12915, #14226
    
    Differential Revision: https://phabricator.haskell.org/D4417
    d5c4d46a