From 5865df5baae7b74fa87311ce3867244183cc1325 Mon Sep 17 00:00:00 2001 From: Max Kazantsev Date: Thu, 17 Jan 2019 12:25:40 +0000 Subject: [PATCH] [LoopSimplifyCFG] Fix order of deletion of complex dead subloops Function `DeleteDeadBlock` requires that all predecessors of a block being deleted have already been deleted, with the exception of a single-block loop. When we use it for removal of dead subloops that contain more than one block, we may not fulfull this requirement and fail an assertion. This patch replaces invocation of `DeleteDeadBlock` with a generalized version `DeleteDeadBlocks` that is able to deal with multiple dead blocks, even if they contain some cycles. Differential Revision: https://reviews.llvm.org/D56121 Reviewed By: fedor.sergeev git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351433 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/LoopSimplifyCFG.cpp | 5 +++-- .../LoopSimplifyCFG/constant-fold-branch.ll | 21 ++++++++++++++++--- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/lib/Transforms/Scalar/LoopSimplifyCFG.cpp b/lib/Transforms/Scalar/LoopSimplifyCFG.cpp index 2e5927f9a06..d51e6005d68 100644 --- a/lib/Transforms/Scalar/LoopSimplifyCFG.cpp +++ b/lib/Transforms/Scalar/LoopSimplifyCFG.cpp @@ -402,9 +402,10 @@ private: LI.erase(LI.getLoopFor(BB)); } LI.removeBlock(BB); - DeleteDeadBlock(BB, &DTU); - ++NumLoopBlocksDeleted; } + + DeleteDeadBlocks(DeadLoopBlocks, &DTU); + NumLoopBlocksDeleted += DeadLoopBlocks.size(); } /// Constant-fold terminators of blocks acculumated in FoldCandidates into the diff --git a/test/Transforms/LoopSimplifyCFG/constant-fold-branch.ll b/test/Transforms/LoopSimplifyCFG/constant-fold-branch.ll index db5f0f1f3f2..25d6f2bbdb2 100644 --- a/test/Transforms/LoopSimplifyCFG/constant-fold-branch.ll +++ b/test/Transforms/LoopSimplifyCFG/constant-fold-branch.ll @@ -1,7 +1,4 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; XFAIL: * -; Tests complex_dead_subloop_branch and complex_dead_subloop_switch fail an -; assertion, therefore the CFG simplification is temporarily disabled. ; REQUIRES: asserts ; RUN: opt -S -enable-loop-simplifycfg-term-folding=true -loop-simplifycfg -debug-only=loop-simplifycfg -verify-loop-info -verify-dom-info -verify-loop-lcssa 2>&1 < %s | FileCheck %s ; RUN: opt -S -enable-loop-simplifycfg-term-folding=true -passes='require,loop(simplify-cfg)' -debug-only=loop-simplifycfg -verify-loop-info -verify-dom-info -verify-loop-lcssa 2>&1 < %s | FileCheck %s @@ -2512,6 +2509,15 @@ exit: } define i32 @complex_dead_subloop_branch(i1 %cond1, i1 %cond2, i1 %cond3) { +; CHECK-LABEL: @complex_dead_subloop_branch( +; CHECK-NEXT: entry: +; CHECK-NEXT: br label [[LOOP:%.*]] +; CHECK: loop: +; CHECK-NEXT: br i1 [[COND3:%.*]], label [[LOOP]], label [[EXIT:%.*]] +; CHECK: exit: +; CHECK-NEXT: [[RESULT_LCSSA:%.*]] = phi i32 [ 0, [[LOOP]] ] +; CHECK-NEXT: ret i32 [[RESULT_LCSSA]] +; entry: br label %loop @@ -2540,6 +2546,15 @@ exit: } define i32 @complex_dead_subloop_switch(i1 %cond1, i1 %cond2, i1 %cond3) { +; CHECK-LABEL: @complex_dead_subloop_switch( +; CHECK-NEXT: entry: +; CHECK-NEXT: br label [[LOOP:%.*]] +; CHECK: loop: +; CHECK-NEXT: br i1 [[COND3:%.*]], label [[LOOP]], label [[EXIT:%.*]] +; CHECK: exit: +; CHECK-NEXT: [[RESULT_LCSSA:%.*]] = phi i32 [ 0, [[LOOP]] ] +; CHECK-NEXT: ret i32 [[RESULT_LCSSA]] +; entry: br label %loop -- 2.50.1