Skip to content
  • Bob Wilson's avatar
    Fix PR7372: Conditional branches (at least on ARM) are treated as predicated, · f82c8fcc
    Bob Wilson authored
    so when IfConverter::CopyAndPredicateBlock checks to see if it should ignore
    an instruction because it is a branch, it should not check if the branch is
    predicated.
    
    This case (when IgnoreBr is true) is only relevant from IfConvertTriangle,
    where new branches are inserted after the block has been copied and predicated.
    If the original branch is not removed, we end up with multiple conditional
    branches (possibly conflicting) at the end of the block.  Aside from any
    immediate errors resulting from that, this confuses the AnalyzeBranch functions
    so that the branches are not analyzable.  That in turn causes the IfConverter to
    think that the "Simple" pattern can be applied, and things go downhill fast
    because the "Simple" pattern does _not_ apply if the block can fall through.
    
    This is pretty fragile.  If there are other degenerate cases where AnalyzeBranch
    fails, but where the block may still fall through, the IfConverter should not
    perform its "Simple" if-conversion.  But, I don't know how to do that with the
    current AnalyzeBranch interface, so for now, the best thing seems to be to
    avoid creating branches that AnalyzeBranch cannot handle.
    
    Evan, please review!
    
    llvm-svn: 106291
    f82c8fcc
Loading