Skip to content
  • Chandler Carruth's avatar
    Move the handling of unanalyzable branches out of the loop-driven chain · f3dc9eff
    Chandler Carruth authored
    formation phase and into the initial walk of the basic blocks. We
    essentially pre-merge all blocks where unanalyzable fallthrough exists,
    as we won't be able to update the terminators effectively after any
    reorderings. This is quite a bit more principled as there may be CFGs
    where the second half of the unanalyzable pair has some analyzable
    predecessor that gets placed first. Then it may get placed next,
    implicitly breaking the unanalyzable branch even though we never even
    looked at the part that isn't analyzable. I've included a test case that
    triggers this (thanks Benjamin yet again!), and I'm hoping to synthesize
    some more general ones as I dig into related issues.
    
    Also, to make this new scheme work we have to be able to handle branches
    into the middle of a chain, so add this check. We always fallback on the
    incoming ordering.
    
    Finally, this starts to really underscore a known limitation of the
    current implementation -- we don't consider broken predecessors when
    merging successors. This can caused major missed opportunities, and is
    something I'm planning on looking at next (modulo more bug reports).
    
    llvm-svn: 144994
    f3dc9eff
Loading