Skip to content
  • Chris Lattner's avatar
    Enable deleting branches to successor blocks. With the previous patches, · bca3e297
    Chris Lattner authored
    branch folding can now compile stuff like this:
    
    void foo(int W, int X, int Y, int Z) {
      if (W & 1) {
        for (; X;--X) bar();
      } else if (W & 2) {
        for (; Y;--Y) bar();
      } else if (W & 4) {
        for (; Z;--Z) bar();
      } else if (W & 8) {
        for (; W;--W) bar();
      }
    
      if (W) {
        bar();
      }
    }
    
    contrived testcase where loops exits all end up merging together.  To have
    the loop merges be:
    
    ...
            cmplw cr0, r30, r27
            bne cr0, LBB1_14        ;bb38
    LBB1_16:        ;cond_next48.loopexit
            mr r27, r29
    LBB1_20:        ;cond_next48
            cmplwi cr0, r27, 0
            beq cr0, LBB1_22        ;UnifiedReturnBlock
    ...
    
    instead of:
    
    
    ...
            cmplw cr0, r30, r27
            bne cr0, LBB1_14        ;bb38
    LBB1_16:        ;cond_next48.loopexit
            mr r27, r29
            b LBB1_20       ;cond_next48
    LBB1_17:        ;cond_next48.loopexit1
            b LBB1_20       ;cond_next48
    LBB1_18:        ;cond_next48.loopexit2
            b LBB1_20       ;cond_next48
    LBB1_19:        ;cond_next48.loopexit3
    LBB1_20:        ;cond_next48
            cmplwi cr0, r27, 0
            beq cr0, LBB1_22        ;UnifiedReturnBlock
    ...
    
    
    This is CodeGen/PowerPC/branch-opt.ll
    
    llvm-svn: 31006
    bca3e297
Loading