Skip to content
  • Chandler Carruth's avatar
    [SDAG] Make the DAGCombine worklist not grow endlessly due to duplicate · 9a0051cd
    Chandler Carruth authored
    insertions.
    
    The old behavior could cause arbitrarily bad memory usage in the DAG
    combiner if there was heavy traffic of adding nodes already on the
    worklist to it. This commit switches the DAG combine worklist to work
    the same way as the instcombine worklist where we null-out removed
    entries and only add new entries to the worklist. My measurements of
    codegen time shows slight improvement. The memory utilization is
    unsurprisingly dominated by other factors (the IR and DAG itself
    I suspect).
    
    This change results in subtle, frustrating churn in the particular order
    in which DAG combines are applied which causes a number of minor
    regressions where we fail to match a pattern previously matched by
    accident. AFAICT, all of these should be using AddToWorklist to directly
    or should be written in a less brittle way. None of the changes seem
    drastically bad, and a few of the changes seem distinctly better.
    
    A major change required to make this work is to significantly harden the
    way in which the DAG combiner handle nodes which become dead
    (zero-uses). Previously, we relied on the ability to "priority-bump"
    them on the combine worklist to achieve recursive deletion of these
    nodes and ensure that the frontier of remaining live nodes all were
    added to the worklist. Instead, I've introduced a routine to just
    implement that precise logic with no indirection. It is a significantly
    simpler operation than that of the combiner worklist proper. I suspect
    this will also fix some other problems with the combiner.
    
    I think the x86 changes are really minor and uninteresting, but the
    avx512 change at least is hiding a "regression" (despite the test case
    being just noise, not testing some performance invariant) that might be
    looked into. Not sure if any of the others impact specific "important"
    code paths, but they didn't look terribly interesting to me, or the
    changes were really minor. The consensus in review is to fix any
    regressions that show up after the fact here.
    
    Thanks to the other reviewers for checking the output on other
    architectures. There is a specific regression on ARM that Tim already
    has a fix prepped to commit.
    
    Differential Revision: http://reviews.llvm.org/D4616
    
    llvm-svn: 213727
    9a0051cd
Loading