[llvm] r350045 - Return "[LoopSimplifyCFG] Delete dead in-loop blocks"

Jordan Rupprecht via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 27 16:31:19 PST 2018


Looks like this causes a crash w/ new pass manager + profile generation.
When using clang (w/ asserts enabled) to compile itself:

$ bin/clang -c ~/src/llvm/lib/CodeGen/RegAllocPBQP.cpp
-I$HOME/src/llvm/include/ -Iinclude -O1 -fprofile-generate
-fexperimental-new-pass-manager
clang-8: ~/src/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp:54: void
llvm::DeleteDeadBlock(llvm::BasicBlock *, llvm::DomTreeUpdater *):
Assertion `(pred_begin(BB) == pred_end(BB)
|| BB->getSinglePredecessor() == BB) && "Block is not dead!"' failed.

Stack:
1.      <eof> parser at end of file
2.      Optimizer
...
 #9 0x00007f9af5ad4719 llvm::DeleteDeadBlock(llvm::BasicBlock*,
llvm::DomTreeUpdater*)
~/src/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp:55:25
#10 0x00007f9af6709f7d
ConstantTerminatorFoldingImpl::deleteDeadLoopBlocks()
~/src/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp:400:7



On Sun, Dec 23, 2018 at 10:09 PM Max Kazantsev via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: mkazantsev
> Date: Sun Dec 23 22:06:17 2018
> New Revision: 350045
>
> URL: http://llvm.org/viewvc/llvm-project?rev=350045&view=rev
> Log:
> Return "[LoopSimplifyCFG] Delete dead in-loop blocks"
>
> The underlying bug that caused the revert should be fixed by rL348567.
>
> Differential Revision: https://reviews.llvm.org/D54023
>
> Modified:
>     llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp
>     llvm/trunk/test/Transforms/LoopSimplifyCFG/constant-fold-branch.ll
>
> Modified: llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp?rev=350045&r1=350044&r2=350045&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp Sun Dec 23
> 22:06:17 2018
> @@ -46,6 +46,8 @@ static cl::opt<bool> EnableTermFolding("
>
>  STATISTIC(NumTerminatorsFolded,
>            "Number of terminators folded to unconditional branches");
> +STATISTIC(NumLoopBlocksDeleted,
> +          "Number of loop blocks deleted");
>
>  /// If \p BB is a switch or a conditional branch, but only one of its
> successors
>  /// can be reached from this block in runtime, return this successor.
> Otherwise,
> @@ -269,6 +271,27 @@ private:
>             "All blocks that stay in loop should be live!");
>    }
>
> +  /// Delete loop blocks that have become unreachable after folding. Make
> all
> +  /// relevant updates to DT and LI.
> +  void deleteDeadLoopBlocks() {
> +    DomTreeUpdater DTU(DT, DomTreeUpdater::UpdateStrategy::Eager);
> +    if (MSSAU)
> +      MSSAU->removeBlocks(DeadLoopBlocks);
> +    for (auto *BB : DeadLoopBlocks) {
> +      assert(BB != L.getHeader() &&
> +             "Header of the current loop cannot be dead!");
> +      LLVM_DEBUG(dbgs() << "Deleting dead loop block " << BB->getName()
> +                        << "\n");
> +      if (LI.isLoopHeader(BB)) {
> +        assert(LI.getLoopFor(BB) != &L && "Attempt to remove current
> loop!");
> +        LI.erase(LI.getLoopFor(BB));
> +      }
> +      LI.removeBlock(BB);
> +      DeleteDeadBlock(BB, &DTU);
> +      ++NumLoopBlocksDeleted;
> +    }
> +  }
> +
>    /// Constant-fold terminators of blocks acculumated in FoldCandidates
> into the
>    /// unconditional branches.
>    void foldTerminators() {
> @@ -358,15 +381,6 @@ public:
>        return false;
>      }
>
> -    // TODO: Support deletion of dead loop blocks.
> -    if (!DeadLoopBlocks.empty()) {
> -      LLVM_DEBUG(dbgs() << "Give up constant terminator folding in loop "
> -                        << L.getHeader()->getName()
> -                        << ": we don't currently"
> -                           " support deletion of dead in-loop blocks.\n");
> -      return false;
> -    }
> -
>      // TODO: Support dead loop exits.
>      if (!DeadExitBlocks.empty()) {
>        LLVM_DEBUG(dbgs() << "Give up constant terminator folding in loop "
> @@ -377,7 +391,8 @@ public:
>
>      // TODO: Support blocks that are not dead, but also not in loop after
> the
>      // folding.
> -    if (BlocksInLoopAfterFolding.size() != L.getNumBlocks()) {
> +    if (BlocksInLoopAfterFolding.size() + DeadLoopBlocks.size() !=
> +        L.getNumBlocks()) {
>        LLVM_DEBUG(
>            dbgs() << "Give up constant terminator folding in loop "
>                   << L.getHeader()->getName()
> @@ -397,6 +412,13 @@ public:
>      // Make the actual transforms.
>      foldTerminators();
>
> +    if (!DeadLoopBlocks.empty()) {
> +      LLVM_DEBUG(dbgs() << "Deleting " << DeadLoopBlocks.size()
> +                    << " dead blocks in loop " << L.getHeader()->getName()
> +                    << "\n");
> +      deleteDeadLoopBlocks();
> +    }
> +
>  #ifndef NDEBUG
>      // Make sure that we have preserved all data structures after the
> transform.
>      DT.verify();
>
> Modified:
> llvm/trunk/test/Transforms/LoopSimplifyCFG/constant-fold-branch.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopSimplifyCFG/constant-fold-branch.ll?rev=350045&r1=350044&r2=350045&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/Transforms/LoopSimplifyCFG/constant-fold-branch.ll
> (original)
> +++ llvm/trunk/test/Transforms/LoopSimplifyCFG/constant-fold-branch.ll Sun
> Dec 23 22:06:17 2018
> @@ -88,18 +88,12 @@ define i32 @dead_block_test_branch_loop(
>  ; CHECK-NEXT:  preheader:
>  ; CHECK-NEXT:    br label [[HEADER:%.*]]
>  ; CHECK:       header:
> -; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[PREHEADER:%.*]] ], [
> [[I_INC:%.*]], [[BACKEDGE:%.*]] ]
> -; CHECK-NEXT:    br i1 true, label [[BACKEDGE]], label [[DEAD:%.*]]
> -; CHECK:       dead:
> -; CHECK-NEXT:    [[I_2:%.*]] = add i32 [[I]], 1
> -; CHECK-NEXT:    br label [[BACKEDGE]]
> -; CHECK:       backedge:
> -; CHECK-NEXT:    [[I_1:%.*]] = phi i32 [ [[I]], [[HEADER]] ], [ [[I_2]],
> [[DEAD]] ]
> -; CHECK-NEXT:    [[I_INC]] = add i32 [[I_1]], 1
> +; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[PREHEADER:%.*]] ], [
> [[I_INC:%.*]], [[HEADER]] ]
> +; CHECK-NEXT:    [[I_INC]] = add i32 [[I]], 1
>  ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I_INC]], [[END:%.*]]
>  ; CHECK-NEXT:    br i1 [[CMP]], label [[HEADER]], label [[EXIT:%.*]]
>  ; CHECK:       exit:
> -; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[BACKEDGE]] ]
> +; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[HEADER]] ]
>  ; CHECK-NEXT:    ret i32 [[I_INC_LCSSA]]
>  ;
>  preheader:
> @@ -129,22 +123,12 @@ define i32 @dead_block_test_switch_loop(
>  ; CHECK-NEXT:  preheader:
>  ; CHECK-NEXT:    br label [[HEADER:%.*]]
>  ; CHECK:       header:
> -; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[PREHEADER:%.*]] ], [
> [[I_INC:%.*]], [[BACKEDGE:%.*]] ]
> -; CHECK-NEXT:    switch i32 1, label [[DEAD:%.*]] [
> -; CHECK-NEXT:    i32 0, label [[DEAD]]
> -; CHECK-NEXT:    i32 1, label [[BACKEDGE]]
> -; CHECK-NEXT:    i32 2, label [[DEAD]]
> -; CHECK-NEXT:    ]
> -; CHECK:       dead:
> -; CHECK-NEXT:    [[I_2:%.*]] = add i32 [[I]], 1
> -; CHECK-NEXT:    br label [[BACKEDGE]]
> -; CHECK:       backedge:
> -; CHECK-NEXT:    [[I_1:%.*]] = phi i32 [ [[I]], [[HEADER]] ], [ [[I_2]],
> [[DEAD]] ]
> -; CHECK-NEXT:    [[I_INC]] = add i32 [[I_1]], 1
> +; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[PREHEADER:%.*]] ], [
> [[I_INC:%.*]], [[HEADER]] ]
> +; CHECK-NEXT:    [[I_INC]] = add i32 [[I]], 1
>  ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I_INC]], [[END:%.*]]
>  ; CHECK-NEXT:    br i1 [[CMP]], label [[HEADER]], label [[EXIT:%.*]]
>  ; CHECK:       exit:
> -; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[BACKEDGE]] ]
> +; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[HEADER]] ]
>  ; CHECK-NEXT:    ret i32 [[I_INC_LCSSA]]
>  ;
>  preheader:
> @@ -175,18 +159,12 @@ define i32 @dead_block_propogate_test_br
>  ; CHECK-NEXT:  preheader:
>  ; CHECK-NEXT:    br label [[HEADER:%.*]]
>  ; CHECK:       header:
> -; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[PREHEADER:%.*]] ], [
> [[I_INC:%.*]], [[BACKEDGE:%.*]] ]
> -; CHECK-NEXT:    br i1 true, label [[BACKEDGE]], label [[DEAD:%.*]]
> -; CHECK:       dead:
> -; CHECK-NEXT:    [[I_2:%.*]] = add i32 [[I]], 1
> -; CHECK-NEXT:    br label [[BACKEDGE]]
> -; CHECK:       backedge:
> -; CHECK-NEXT:    [[I_1:%.*]] = phi i32 [ [[I]], [[HEADER]] ], [ [[I_2]],
> [[DEAD]] ]
> -; CHECK-NEXT:    [[I_INC]] = add i32 [[I_1]], 1
> +; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[PREHEADER:%.*]] ], [
> [[I_INC:%.*]], [[HEADER]] ]
> +; CHECK-NEXT:    [[I_INC]] = add i32 [[I]], 1
>  ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I_INC]], [[END:%.*]]
>  ; CHECK-NEXT:    br i1 [[CMP]], label [[HEADER]], label [[EXIT:%.*]]
>  ; CHECK:       exit:
> -; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[BACKEDGE]] ]
> +; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[HEADER]] ]
>  ; CHECK-NEXT:    ret i32 [[I_INC_LCSSA]]
>  ;
>  preheader:
> @@ -219,22 +197,12 @@ define i32 @dead_block_propogate_test_sw
>  ; CHECK-NEXT:  preheader:
>  ; CHECK-NEXT:    br label [[HEADER:%.*]]
>  ; CHECK:       header:
> -; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[PREHEADER:%.*]] ], [
> [[I_INC:%.*]], [[BACKEDGE:%.*]] ]
> -; CHECK-NEXT:    switch i32 1, label [[DEAD:%.*]] [
> -; CHECK-NEXT:    i32 0, label [[DEAD]]
> -; CHECK-NEXT:    i32 1, label [[BACKEDGE]]
> -; CHECK-NEXT:    i32 2, label [[DEAD]]
> -; CHECK-NEXT:    ]
> -; CHECK:       dead:
> -; CHECK-NEXT:    [[I_2:%.*]] = add i32 [[I]], 1
> -; CHECK-NEXT:    br label [[BACKEDGE]]
> -; CHECK:       backedge:
> -; CHECK-NEXT:    [[I_1:%.*]] = phi i32 [ [[I]], [[HEADER]] ], [ [[I_2]],
> [[DEAD]] ]
> -; CHECK-NEXT:    [[I_INC]] = add i32 [[I_1]], 1
> +; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[PREHEADER:%.*]] ], [
> [[I_INC:%.*]], [[HEADER]] ]
> +; CHECK-NEXT:    [[I_INC]] = add i32 [[I]], 1
>  ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I_INC]], [[END:%.*]]
>  ; CHECK-NEXT:    br i1 [[CMP]], label [[HEADER]], label [[EXIT:%.*]]
>  ; CHECK:       exit:
> -; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[BACKEDGE]] ]
> +; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[HEADER]] ]
>  ; CHECK-NEXT:    ret i32 [[I_INC_LCSSA]]
>  ;
>  preheader:
> @@ -463,32 +431,19 @@ define i32 @dead_sub_loop_test_branch_lo
>  ; CHECK-NEXT:  preheader:
>  ; CHECK-NEXT:    br label [[HEADER:%.*]]
>  ; CHECK:       header:
> -; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[PREHEADER:%.*]] ], [
> [[I_INC:%.*]], [[BACKEDGE:%.*]] ]
> -; CHECK-NEXT:    br i1 true, label [[LIVE_PREHEADER:%.*]], label
> [[DEAD_PREHEADER:%.*]]
> -; CHECK:       live_preheader:
> +; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[PREHEADER:%.*]] ], [
> [[I_INC:%.*]], [[EXIT_A:%.*]] ]
>  ; CHECK-NEXT:    br label [[LIVE_LOOP:%.*]]
>  ; CHECK:       live_loop:
> -; CHECK-NEXT:    [[A:%.*]] = phi i32 [ 0, [[LIVE_PREHEADER]] ], [
> [[A_INC:%.*]], [[LIVE_LOOP]] ]
> +; CHECK-NEXT:    [[A:%.*]] = phi i32 [ 0, [[HEADER]] ], [ [[A_INC:%.*]],
> [[LIVE_LOOP]] ]
>  ; CHECK-NEXT:    [[A_INC]] = add i32 [[A]], 1
>  ; CHECK-NEXT:    [[CMP_A:%.*]] = icmp slt i32 [[A_INC]], [[END:%.*]]
> -; CHECK-NEXT:    br i1 [[CMP_A]], label [[LIVE_LOOP]], label
> [[EXIT_A:%.*]]
> +; CHECK-NEXT:    br i1 [[CMP_A]], label [[LIVE_LOOP]], label [[EXIT_A]]
>  ; CHECK:       exit.a:
> -; CHECK-NEXT:    br label [[BACKEDGE]]
> -; CHECK:       dead_preheader:
> -; CHECK-NEXT:    br label [[DEAD_LOOP:%.*]]
> -; CHECK:       dead_loop:
> -; CHECK-NEXT:    [[B:%.*]] = phi i32 [ 0, [[DEAD_PREHEADER]] ], [
> [[B_INC:%.*]], [[DEAD_LOOP]] ]
> -; CHECK-NEXT:    [[B_INC]] = add i32 [[B]], 1
> -; CHECK-NEXT:    [[CMP_B:%.*]] = icmp slt i32 [[B_INC]], [[END]]
> -; CHECK-NEXT:    br i1 [[CMP_B]], label [[DEAD_LOOP]], label
> [[EXIT_B:%.*]]
> -; CHECK:       exit.b:
> -; CHECK-NEXT:    br label [[BACKEDGE]]
> -; CHECK:       backedge:
>  ; CHECK-NEXT:    [[I_INC]] = add i32 [[I]], 1
>  ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I_INC]], [[END]]
>  ; CHECK-NEXT:    br i1 [[CMP]], label [[HEADER]], label [[EXIT:%.*]]
>  ; CHECK:       exit:
> -; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[BACKEDGE]] ]
> +; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[EXIT_A]] ]
>  ; CHECK-NEXT:    ret i32 [[I_INC_LCSSA]]
>  ;
>  preheader:
> @@ -536,36 +491,19 @@ define i32 @dead_sub_loop_test_switch_lo
>  ; CHECK-NEXT:  preheader:
>  ; CHECK-NEXT:    br label [[HEADER:%.*]]
>  ; CHECK:       header:
> -; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[PREHEADER:%.*]] ], [
> [[I_INC:%.*]], [[BACKEDGE:%.*]] ]
> -; CHECK-NEXT:    switch i32 1, label [[DEAD_PREHEADER:%.*]] [
> -; CHECK-NEXT:    i32 0, label [[DEAD_PREHEADER]]
> -; CHECK-NEXT:    i32 1, label [[LIVE_PREHEADER:%.*]]
> -; CHECK-NEXT:    i32 2, label [[DEAD_PREHEADER]]
> -; CHECK-NEXT:    ]
> -; CHECK:       live_preheader:
> +; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[PREHEADER:%.*]] ], [
> [[I_INC:%.*]], [[EXIT_A:%.*]] ]
>  ; CHECK-NEXT:    br label [[LIVE_LOOP:%.*]]
>  ; CHECK:       live_loop:
> -; CHECK-NEXT:    [[A:%.*]] = phi i32 [ 0, [[LIVE_PREHEADER]] ], [
> [[A_INC:%.*]], [[LIVE_LOOP]] ]
> +; CHECK-NEXT:    [[A:%.*]] = phi i32 [ 0, [[HEADER]] ], [ [[A_INC:%.*]],
> [[LIVE_LOOP]] ]
>  ; CHECK-NEXT:    [[A_INC]] = add i32 [[A]], 1
>  ; CHECK-NEXT:    [[CMP_A:%.*]] = icmp slt i32 [[A_INC]], [[END:%.*]]
> -; CHECK-NEXT:    br i1 [[CMP_A]], label [[LIVE_LOOP]], label
> [[EXIT_A:%.*]]
> +; CHECK-NEXT:    br i1 [[CMP_A]], label [[LIVE_LOOP]], label [[EXIT_A]]
>  ; CHECK:       exit.a:
> -; CHECK-NEXT:    br label [[BACKEDGE]]
> -; CHECK:       dead_preheader:
> -; CHECK-NEXT:    br label [[DEAD_LOOP:%.*]]
> -; CHECK:       dead_loop:
> -; CHECK-NEXT:    [[B:%.*]] = phi i32 [ 0, [[DEAD_PREHEADER]] ], [
> [[B_INC:%.*]], [[DEAD_LOOP]] ]
> -; CHECK-NEXT:    [[B_INC]] = add i32 [[B]], 1
> -; CHECK-NEXT:    [[CMP_B:%.*]] = icmp slt i32 [[B_INC]], [[END]]
> -; CHECK-NEXT:    br i1 [[CMP_B]], label [[DEAD_LOOP]], label
> [[EXIT_B:%.*]]
> -; CHECK:       exit.b:
> -; CHECK-NEXT:    br label [[BACKEDGE]]
> -; CHECK:       backedge:
>  ; CHECK-NEXT:    [[I_INC]] = add i32 [[I]], 1
>  ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I_INC]], [[END]]
>  ; CHECK-NEXT:    br i1 [[CMP]], label [[HEADER]], label [[EXIT:%.*]]
>  ; CHECK:       exit:
> -; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[BACKEDGE]] ]
> +; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[EXIT_A]] ]
>  ; CHECK-NEXT:    ret i32 [[I_INC_LCSSA]]
>  ;
>  preheader:
> @@ -898,18 +836,12 @@ define i32 @partial_sub_loop_test_branch
>  ; CHECK-NEXT:    [[J:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [
> [[J_INC:%.*]], [[OUTER_BACKEDGE:%.*]] ]
>  ; CHECK-NEXT:    br label [[HEADER:%.*]]
>  ; CHECK:       header:
> -; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[OUTER_HEADER]] ], [
> [[I_INC:%.*]], [[BACKEDGE:%.*]] ]
> -; CHECK-NEXT:    br i1 true, label [[BACKEDGE]], label [[DEAD:%.*]]
> -; CHECK:       dead:
> -; CHECK-NEXT:    [[I_2:%.*]] = add i32 [[I]], 1
> -; CHECK-NEXT:    br label [[BACKEDGE]]
> -; CHECK:       backedge:
> -; CHECK-NEXT:    [[I_1:%.*]] = phi i32 [ [[I]], [[HEADER]] ], [ [[I_2]],
> [[DEAD]] ]
> -; CHECK-NEXT:    [[I_INC]] = add i32 [[I_1]], 1
> +; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[OUTER_HEADER]] ], [
> [[I_INC:%.*]], [[HEADER]] ]
> +; CHECK-NEXT:    [[I_INC]] = add i32 [[I]], 1
>  ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I_INC]], [[END:%.*]]
>  ; CHECK-NEXT:    br i1 [[CMP]], label [[HEADER]], label [[OUTER_BACKEDGE]]
>  ; CHECK:       outer_backedge:
> -; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[BACKEDGE]] ]
> +; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[HEADER]] ]
>  ; CHECK-NEXT:    [[J_INC]] = add i32 [[J]], 1
>  ; CHECK-NEXT:    [[CMP_J:%.*]] = icmp slt i32 [[J_INC]], [[END]]
>  ; CHECK-NEXT:    br i1 [[CMP_J]], label [[OUTER_HEADER]], label
> [[EXIT:%.*]]
> @@ -958,22 +890,12 @@ define i32 @partial_sub_loop_test_switch
>  ; CHECK-NEXT:    [[J:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [
> [[J_INC:%.*]], [[OUTER_BACKEDGE:%.*]] ]
>  ; CHECK-NEXT:    br label [[HEADER:%.*]]
>  ; CHECK:       header:
> -; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[OUTER_HEADER]] ], [
> [[I_INC:%.*]], [[BACKEDGE:%.*]] ]
> -; CHECK-NEXT:    switch i32 1, label [[DEAD:%.*]] [
> -; CHECK-NEXT:    i32 0, label [[DEAD]]
> -; CHECK-NEXT:    i32 1, label [[BACKEDGE]]
> -; CHECK-NEXT:    i32 2, label [[DEAD]]
> -; CHECK-NEXT:    ]
> -; CHECK:       dead:
> -; CHECK-NEXT:    [[I_2:%.*]] = add i32 [[I]], 1
> -; CHECK-NEXT:    br label [[BACKEDGE]]
> -; CHECK:       backedge:
> -; CHECK-NEXT:    [[I_1:%.*]] = phi i32 [ [[I]], [[HEADER]] ], [ [[I_2]],
> [[DEAD]] ]
> -; CHECK-NEXT:    [[I_INC]] = add i32 [[I_1]], 1
> +; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[OUTER_HEADER]] ], [
> [[I_INC:%.*]], [[HEADER]] ]
> +; CHECK-NEXT:    [[I_INC]] = add i32 [[I]], 1
>  ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I_INC]], [[END:%.*]]
>  ; CHECK-NEXT:    br i1 [[CMP]], label [[HEADER]], label [[OUTER_BACKEDGE]]
>  ; CHECK:       outer_backedge:
> -; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[BACKEDGE]] ]
> +; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[HEADER]] ]
>  ; CHECK-NEXT:    [[J_INC]] = add i32 [[J]], 1
>  ; CHECK-NEXT:    [[CMP_J:%.*]] = icmp slt i32 [[J_INC]], [[END]]
>  ; CHECK-NEXT:    br i1 [[CMP_J]], label [[OUTER_HEADER]], label
> [[EXIT:%.*]]
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181227/f5c24ad5/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 4849 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181227/f5c24ad5/attachment-0001.bin>


More information about the llvm-commits mailing list