[llvm] r368565 - [CodeGen] Do the Simple Early Return in block-placement pass to optimize the blocks

Roman Lebedev via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 12 06:16:30 PDT 2019


This is being recommitted, but that isn't being said in the commit message,
also this is being recommitted but no test is being added?

On Mon, Aug 12, 2019 at 4:14 PM Kang Zhang via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
>
> Author: zhangkang
> Date: Mon Aug 12 06:15:31 2019
> New Revision: 368565
>
> URL: http://llvm.org/viewvc/llvm-project?rev=368565&view=rev
> Log:
> [CodeGen] Do the Simple Early Return in block-placement pass to optimize the blocks
>
> Summary:
>
> In `block-placement` pass, it will create some patterns for unconditional we can do the simple early retrun.
> But the `early-ret` pass is before `block-placement`, we don't want to run it again.
> This patch is to do the simple early return to optimize the blocks at the last of `block-placement`.
>
> Reviewed By: efriedma
>
> Differential Revision: https://reviews.llvm.org/D63972
>
> Modified:
>     llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp
>     llvm/trunk/test/CodeGen/PowerPC/block-placement.mir
>
> Modified: llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp?rev=368565&r1=368564&r2=368565&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp (original)
> +++ llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp Mon Aug 12 06:15:31 2019
> @@ -2755,6 +2755,7 @@ void MachineBlockPlacement::optimizeBran
>    // cannot because all branches may not be analyzable.
>    // E.g., the target may be able to remove an unconditional branch to
>    // a fallthrough when it occurs after predicated terminators.
> +  SmallVector<MachineBasicBlock*, 4> EmptyBB;
>    for (MachineBasicBlock *ChainBB : FunctionChain) {
>      Cond.clear();
>      MachineBasicBlock *TBB = nullptr, *FBB = nullptr; // For AnalyzeBranch.
> @@ -2774,9 +2775,42 @@ void MachineBlockPlacement::optimizeBran
>          TII->removeBranch(*ChainBB);
>          TII->insertBranch(*ChainBB, FBB, TBB, Cond, dl);
>          ChainBB->updateTerminator();
> +      } else if (Cond.empty() && TBB && ChainBB != TBB && !TBB->empty() &&
> +                 !TBB->canFallThrough()) {
> +        // When ChainBB is unconditional branch to the TBB, and TBB has no
> +        // fallthrough predecessor and fallthrough successor, try to merge
> +        // ChainBB and TBB. This is legal under the one of following conditions:
> +        // 1. ChainBB is empty except for an unconditional branch.
> +        // 2. TBB has only one predecessor.
> +        MachineFunction::iterator I(TBB);
> +        if (((TBB == &*F->begin()) || !std::prev(I)->canFallThrough()) &&
> +             (TailDup.isSimpleBB(ChainBB) || (TBB->pred_size() == 1))) {
> +          TII->removeBranch(*ChainBB);
> +          ChainBB->removeSuccessor(TBB);
> +
> +          // Update the CFG.
> +          while (!TBB->pred_empty()) {
> +            MachineBasicBlock *Pred = *(TBB->pred_end()-1);
> +            Pred->ReplaceUsesOfBlockWith(TBB, ChainBB);
> +          }
> +
> +          for (MachineBasicBlock *Succ : TBB->successors())
> +            ChainBB->addSuccessor(Succ, MBPI->getEdgeProbability(TBB, Succ));
> +
> +          // Move all the instructions of TBB to ChainBB.
> +          ChainBB->splice(ChainBB->end(), TBB, TBB->begin(), TBB->end());
> +          EmptyBB.push_back(TBB);
> +        }
>        }
>      }
>    }
> +
> +  for (auto BB: EmptyBB) {
> +    MLI->removeBlock(BB);
> +    FunctionChain.remove(BB);
> +    BlockToChain.erase(BB);
> +    F->erase(BB);
> +  }
>  }
>
>  void MachineBlockPlacement::alignBlocks() {
> @@ -3096,6 +3130,9 @@ bool MachineBlockPlacement::runOnMachine
>      }
>    }
>
> +  // optimizeBranches() may change the blocks, but we haven't updated the
> +  // post-dominator tree. Because the post-dominator tree won't be used after
> +  // this function and this pass don't preserve the post-dominator tree.
>    optimizeBranches();
>    alignBlocks();
>
>
> Modified: llvm/trunk/test/CodeGen/PowerPC/block-placement.mir
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PowerPC/block-placement.mir?rev=368565&r1=368564&r2=368565&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/PowerPC/block-placement.mir (original)
> +++ llvm/trunk/test/CodeGen/PowerPC/block-placement.mir Mon Aug 12 06:15:31 2019
> @@ -209,14 +209,10 @@ body:             |
>      BLR8 implicit $lr8, implicit $rm, implicit killed $x3
>
>    ; CHECK:      bb.5.if.else.i:
> -  ; CHECK:        successors: %bb.11(0x80000000)
> -  ; CHECK:        B %bb.11
> +  ; CHECK-NEXT:   renamable $x3 = LI8 1
> +  ; CHECK-NEXT:   BLR8 implicit $lr8, implicit $rm, implicit killed $x3
>
>    ; CHECK:      bb.8.while.body.i (align 4):
> -  ; CHECK:        successors: %bb.11(0x04000000), %bb.9(0x7c000000)
> -  ; CHECK:        BCC 76, killed renamable $cr0, %bb.11
> -
> -  ; CHECK:      bb.11:
> -  ; CHECK:        renamable $x3 = LI8 1
> -  ; CHECK-NEXT:   BLR8 implicit $lr8, implicit $rm, implicit killed $x3
> +  ; CHECK:        successors: %bb.5(0x04000000), %bb.9(0x7c000000)
> +  ; CHECK:        BCC 76, killed renamable $cr0, %bb.5
>  ...
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list