diff options
-rw-r--r-- | llvm/include/llvm/Support/GenericDomTree.h | 10 | ||||
-rw-r--r-- | llvm/include/llvm/Support/GenericDomTreeConstruction.h | 89 | ||||
-rw-r--r-- | llvm/lib/Transforms/Scalar/ADCE.cpp | 51 | ||||
-rw-r--r-- | llvm/test/Analysis/PostDominators/pr24415.ll | 18 | ||||
-rw-r--r-- | llvm/test/Analysis/PostDominators/pr6047_a.ll | 7 | ||||
-rw-r--r-- | llvm/test/Analysis/PostDominators/pr6047_b.ll | 8 | ||||
-rw-r--r-- | llvm/test/Analysis/PostDominators/pr6047_c.ll | 51 | ||||
-rw-r--r-- | llvm/test/Analysis/PostDominators/pr6047_d.ll | 10 | ||||
-rw-r--r-- | llvm/test/Analysis/RegionInfo/infinite_loop.ll | 4 | ||||
-rw-r--r-- | llvm/test/Analysis/RegionInfo/infinite_loop_2.ll | 11 | ||||
-rw-r--r-- | llvm/test/Analysis/RegionInfo/infinite_loop_3.ll | 19 | ||||
-rw-r--r-- | llvm/test/Analysis/RegionInfo/infinite_loop_4.ll | 14 | ||||
-rw-r--r-- | llvm/test/Analysis/RegionInfo/infinite_loop_5_a.ll | 1 | ||||
-rw-r--r-- | llvm/test/Analysis/RegionInfo/infinite_loop_5_b.ll | 1 | ||||
-rw-r--r-- | llvm/test/Transforms/StructurizeCFG/branch-on-argument.ll | 9 | ||||
-rw-r--r-- | llvm/test/Transforms/StructurizeCFG/no-branch-to-entry.ll | 1 |
16 files changed, 198 insertions, 106 deletions
diff --git a/llvm/include/llvm/Support/GenericDomTree.h b/llvm/include/llvm/Support/GenericDomTree.h index 8be7c7d0b43..acad850f220 100644 --- a/llvm/include/llvm/Support/GenericDomTree.h +++ b/llvm/include/llvm/Support/GenericDomTree.h @@ -770,22 +770,12 @@ public: /// recalculate - compute a dominator tree for the given function template <class FT> void recalculate(FT &F) { - typedef GraphTraits<FT *> TraitsTy; reset(); this->Vertex.push_back(nullptr); if (!this->IsPostDominators) { - // Initialize root - NodeT *entry = TraitsTy::getEntryNode(&F); - addRoot(entry); - Calculate<FT, NodeT *>(*this, F); } else { - // Initialize the roots list - for (auto *Node : nodes(&F)) - if (TraitsTy::child_begin(Node) == TraitsTy::child_end(Node)) - addRoot(Node); - Calculate<FT, Inverse<NodeT *>>(*this, F); } } diff --git a/llvm/include/llvm/Support/GenericDomTreeConstruction.h b/llvm/include/llvm/Support/GenericDomTreeConstruction.h index c1d757f3ab6..9d84bc62c93 100644 --- a/llvm/include/llvm/Support/GenericDomTreeConstruction.h +++ b/llvm/include/llvm/Support/GenericDomTreeConstruction.h @@ -25,6 +25,7 @@ #define LLVM_SUPPORT_GENERICDOMTREECONSTRUCTION_H #include "llvm/ADT/DepthFirstIterator.h" +#include "llvm/ADT/PostOrderIterator.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/Support/GenericDomTree.h" @@ -39,8 +40,10 @@ public: df_iterator_dom_storage(BaseSet &Storage) : Storage(Storage) {} typedef typename BaseSet::iterator iterator; - std::pair<iterator, bool> insert(NodeRef N) { - return Storage.insert({N, InfoType()}); + std::pair<iterator, bool> insert(NodeRef To) { + auto Result = Storage.insert({To, InfoType()}); + + return Result; } void completed(NodeRef) {} @@ -55,7 +58,6 @@ unsigned ReverseDFSPass(DominatorTreeBaseByGraphTraits<GraphT> &DT, typename GraphT::NodeRef, typename DominatorTreeBaseByGraphTraits<GraphT>::InfoRec> DFStorage(DT.Info); - bool IsChildOfArtificialExit = (N != 0); for (auto I = idf_ext_begin(V, DFStorage), E = idf_ext_end(V, DFStorage); I != E; ++I) { typename GraphT::NodeRef BB = *I; @@ -67,11 +69,6 @@ unsigned ReverseDFSPass(DominatorTreeBaseByGraphTraits<GraphT> &DT, if (I.getPathLength() > 1) BBInfo.Parent = DT.Info[I.getPath(I.getPathLength() - 2)].DFSNum; DT.Vertex.push_back(BB); // Vertex[n] = V; - - if (IsChildOfArtificialExit) - BBInfo.Parent = 1; - - IsChildOfArtificialExit = false; } return N; } @@ -142,34 +139,78 @@ template <class FuncT, class NodeT> void Calculate(DominatorTreeBaseByGraphTraits<GraphTraits<NodeT>> &DT, FuncT &F) { typedef GraphTraits<NodeT> GraphT; + typedef GraphTraits<FuncT *> FuncGraphT; static_assert(std::is_pointer<typename GraphT::NodeRef>::value, "NodeRef should be pointer type"); typedef typename std::remove_pointer<typename GraphT::NodeRef>::type NodeType; unsigned N = 0; - bool MultipleRoots = (DT.Roots.size() > 1); - if (MultipleRoots) { + bool NeedFakeRoot = DT.isPostDominator(); + // If this is post dominators, push a fake node to start + if (NeedFakeRoot) { auto &BBInfo = DT.Info[nullptr]; BBInfo.DFSNum = BBInfo.Semi = ++N; BBInfo.Label = nullptr; - - DT.Vertex.push_back(nullptr); // Vertex[n] = V; + DT.Vertex.push_back(nullptr); // Vertex[n] = V; + } else { + // The root is the entry block of the CFG + DT.addRoot(FuncGraphT::getEntryNode(&F)); } // Step #1: Number blocks in depth-first order and initialize variables used // in later stages of the algorithm. - if (DT.isPostDominator()){ - for (unsigned i = 0, e = static_cast<unsigned>(DT.Roots.size()); - i != e; ++i) - N = ReverseDFSPass<GraphT>(DT, DT.Roots[i], N); - } else { - N = DFSPass<GraphT>(DT, DT.Roots[0], N); + if (DT.isPostDominator()) { + unsigned Total = 0; + for (auto I : nodes(&F)) { + ++Total; + // If it has no *successors*, it is definitely a root. + if (FuncGraphT::child_begin(I) == FuncGraphT::child_end(I)) { + N = ReverseDFSPass<GraphT>(DT, I, N); + DT.Info[I].Parent = 1; + DT.addRoot(I); + } + } + // Accounting for the virtual exit, see if we had any unreachable nodes + if (Total + 1 != N ) { + // Make another DFS pass over all other nodes to find the unreachable + // blocks, and find the furthest paths we'll be able to make. + // Note that this looks N^2, but it's really 2N worst case, if every node + // is unreachable. This is because we are still going to only visit each + // unreachable node once, we may just visit it in two directions, + // depending on how lucky we get. + SmallPtrSet<NodeType *, 4> ConnectToExitBlock; + for (auto I : nodes(&F)) + if (!DT.Info.count(I)) { + // Find the furthest away we can get by following successors, then + // follow them in reverse. This gives us some reasonable answer about + // the post-dom tree inside any infinite loop. In particular, it + // guarantees we get to the farthest away point along *some* + // path. This also matches GCC behavior. If we really wanted a + // totally complete picture of dominance inside this infinite loop, we + // could do it with SCC-like algorithms to find the lowest and highest + // points in the infinite loop. In theory, it would be nice to give + // the canonical backedge for the loop, but it's expensive. + auto *FurthestAway = *po_begin(I); + ConnectToExitBlock.insert(FurthestAway); + N = ReverseDFSPass<GraphT>(DT, FurthestAway, N); + } + // Finally, now everything should be visited, and anything with parent + // == + // 0 should be connected to virtual exit. + for (auto *Node : ConnectToExitBlock) { + auto FindResult = DT.Info.find(Node); + assert(FindResult != DT.Info.end() && + "Everything should have been visited by now"); + if (FindResult->second.Parent == 0) { + FindResult->second.Parent = 1; + DT.addRoot(Node); + } + } + } + } else { + N = DFSPass<GraphT>(DT, GraphTraits<FuncT *>::getEntryNode(&F), N); } - // it might be that some blocks did not get a DFS number (e.g., blocks of - // infinite loops). In these cases an artificial exit node is required. - MultipleRoots |= (DT.isPostDominator() && N != GraphTraits<FuncT*>::size(&F)); - // When naively implemented, the Lengauer-Tarjan algorithm requires a separate // bucket for each vertex. However, this is unnecessary, because each vertex // is only placed into a single bucket (that of its semidominator), and each @@ -234,13 +275,11 @@ void Calculate(DominatorTreeBaseByGraphTraits<GraphTraits<NodeT>> &DT, WIDom = DT.IDoms[WIDom]; } - if (DT.Roots.empty()) return; - // Add a node for the root. This node might be the actual root, if there is // one exit block, or it may be the virtual exit (denoted by (BasicBlock *)0) // which postdominates all real exits if there are multiple exit blocks, or // an infinite loop. - typename GraphT::NodeRef Root = !MultipleRoots ? DT.Roots[0] : nullptr; + typename GraphT::NodeRef Root = NeedFakeRoot ? nullptr : DT.Roots[0]; DT.RootNode = (DT.DomTreeNodes[Root] = diff --git a/llvm/lib/Transforms/Scalar/ADCE.cpp b/llvm/lib/Transforms/Scalar/ADCE.cpp index 571e70c746e..63205461c08 100644 --- a/llvm/lib/Transforms/Scalar/ADCE.cpp +++ b/llvm/lib/Transforms/Scalar/ADCE.cpp @@ -253,46 +253,23 @@ void AggressiveDeadCodeElimination::initialize() { } } - // Mark blocks live if there is no path from the block to the - // return of the function or a successor for which this is true. - // This protects IDFCalculator which cannot handle such blocks. - for (auto &BBInfoPair : BlockInfo) { - auto &BBInfo = BBInfoPair.second; - if (BBInfo.terminatorIsLive()) - continue; - auto *BB = BBInfo.BB; - if (!PDT.getNode(BB)) { - markLive(BBInfo.Terminator); - continue; - } - for (auto *Succ : successors(BB)) - if (!PDT.getNode(Succ)) { - markLive(BBInfo.Terminator); - break; - } - } - - // Mark blocks live if there is no path from the block to the - // return of the function or a successor for which this is true. - // This protects IDFCalculator which cannot handle such blocks. - for (auto &BBInfoPair : BlockInfo) { - auto &BBInfo = BBInfoPair.second; - if (BBInfo.terminatorIsLive()) - continue; - auto *BB = BBInfo.BB; - if (!PDT.getNode(BB)) { - DEBUG(dbgs() << "Not post-dominated by return: " << BB->getName() + // Mark blocks live if there is no path from the block to a + // return of the function. + // We do this by seeing which of the postdomtree root children exit the + // program, and for all others, mark the subtree live. + for (auto &PDTChild : children<DomTreeNode *>(PDT.getRootNode())) { + auto *BB = PDTChild->getBlock(); + auto &Info = BlockInfo[BB]; + // Real function return + if (isa<ReturnInst>(Info.Terminator)) { + DEBUG(dbgs() << "post-dom root child is not a return: " << BB->getName() << '\n';); - markLive(BBInfo.Terminator); continue; } - for (auto *Succ : successors(BB)) - if (!PDT.getNode(Succ)) { - DEBUG(dbgs() << "Successor not post-dominated by return: " - << BB->getName() << '\n';); - markLive(BBInfo.Terminator); - break; - } + + // This child is something else, like an infinite loop. + for (auto DFNode : depth_first(PDTChild)) + markLive(BlockInfo[DFNode->getBlock()].Terminator); } // Treat the entry block as always live diff --git a/llvm/test/Analysis/PostDominators/pr24415.ll b/llvm/test/Analysis/PostDominators/pr24415.ll new file mode 100644 index 00000000000..e71c33bacf6 --- /dev/null +++ b/llvm/test/Analysis/PostDominators/pr24415.ll @@ -0,0 +1,18 @@ +; RUN: opt < %s -postdomtree -analyze | FileCheck %s +; RUN: opt < %s -passes='print<postdomtree>' 2>&1 | FileCheck %s + +; Function Attrs: nounwind ssp uwtable +define void @foo() { + br label %1 + +; <label>:1 ; preds = %0, %1 + br label %1 + ; No predecessors! + ret void +} + +; CHECK: Inorder PostDominator Tree: +; CHECK-NEXT: [1] <<exit node>> {0,7} +; CHECK-NEXT: [2] %2 {1,2} +; CHECK-NEXT: [2] %1 {3,6} +; CHECK-NEXT: [3] %0 {4,5} diff --git a/llvm/test/Analysis/PostDominators/pr6047_a.ll b/llvm/test/Analysis/PostDominators/pr6047_a.ll index ec1455b46fe..05f87125025 100644 --- a/llvm/test/Analysis/PostDominators/pr6047_a.ll +++ b/llvm/test/Analysis/PostDominators/pr6047_a.ll @@ -12,4 +12,9 @@ bb35.loopexit3: bb35: ret void } -; CHECK: [3] %entry +;CHECK:Inorder PostDominator Tree: +;CHECK-NEXT: [1] <<exit node>> {0,9} +;CHECK-NEXT: [2] %bb35 {1,4} +;CHECK-NEXT: [3] %bb35.loopexit3 {2,3} +;CHECK-NEXT: [2] %entry {5,6} +;CHECK-NEXT: [2] %bb3.i {7,8} diff --git a/llvm/test/Analysis/PostDominators/pr6047_b.ll b/llvm/test/Analysis/PostDominators/pr6047_b.ll index 7bd2c86b737..f5ff754fa65 100644 --- a/llvm/test/Analysis/PostDominators/pr6047_b.ll +++ b/llvm/test/Analysis/PostDominators/pr6047_b.ll @@ -16,4 +16,10 @@ bb35.loopexit3: bb35: ret void } -; CHECK: [4] %entry +; CHECK: Inorder PostDominator Tree: +; CHECK-NEXT: [1] <<exit node>> {0,11} +; CHECK-NEXT: [2] %bb35 {1,4} +; CHECK-NEXT: [3] %bb35.loopexit3 {2,3} +; CHECK-NEXT: [2] %a {5,6} +; CHECK-NEXT: [2] %entry {7,8} +; CHECK-NEXT: [2] %bb3.i {9,10} diff --git a/llvm/test/Analysis/PostDominators/pr6047_c.ll b/llvm/test/Analysis/PostDominators/pr6047_c.ll index 08c9551f156..24a7f1ae562 100644 --- a/llvm/test/Analysis/PostDominators/pr6047_c.ll +++ b/llvm/test/Analysis/PostDominators/pr6047_c.ll @@ -144,4 +144,53 @@ bb35.loopexit3: bb35: ret void } -; CHECK: [3] %entry +; CHECK: Inorder PostDominator Tree: +; CHECK-NEXT: [1] <<exit node>> {0,97} +; CHECK-NEXT: [2] %bb35 {1,92} +; CHECK-NEXT: [3] %bb35.loopexit3 {2,3} +; CHECK-NEXT: [3] %bb35.loopexit {4,5} +; CHECK-NEXT: [3] %bb31 {6,7} +; CHECK-NEXT: [3] %bb30 {8,9} +; CHECK-NEXT: [3] %bb30.loopexit1 {10,11} +; CHECK-NEXT: [3] %bb30.loopexit {12,13} +; CHECK-NEXT: [3] %bb23 {14,15} +; CHECK-NEXT: [3] %bb23.us {16,17} +; CHECK-NEXT: [3] %bb23.preheader {18,19} +; CHECK-NEXT: [3] %bb23.us.preheader {20,21} +; CHECK-NEXT: [3] %bb.nph {22,23} +; CHECK-NEXT: [3] %bb29.preheader {24,25} +; CHECK-NEXT: [3] %bb20 {26,27} +; CHECK-NEXT: [3] %bb19 {28,29} +; CHECK-NEXT: [3] %bb.nph14 {30,31} +; CHECK-NEXT: [3] %bb17.loopexit.split {32,33} +; CHECK-NEXT: [3] %bb16 {34,35} +; CHECK-NEXT: [3] %bb15 {36,37} +; CHECK-NEXT: [3] %bb15.loopexit2 {38,39} +; CHECK-NEXT: [3] %bb15.loopexit {40,41} +; CHECK-NEXT: [3] %bb8 {42,43} +; CHECK-NEXT: [3] %bb8.us {44,45} +; CHECK-NEXT: [3] %bb8.preheader {46,47} +; CHECK-NEXT: [3] %bb8.us.preheader {48,49} +; CHECK-NEXT: [3] %bb.nph18 {50,51} +; CHECK-NEXT: [3] %bb14.preheader {52,53} +; CHECK-NEXT: [3] %bb5 {54,55} +; CHECK-NEXT: [3] %bb4 {56,57} +; CHECK-NEXT: [3] %bb.nph21 {58,59} +; CHECK-NEXT: [3] %bb3.i.loopexit.us {60,61} +; CHECK-NEXT: [3] %bb8.i.us {62,63} +; CHECK-NEXT: [3] %bb4.i.us {64,65} +; CHECK-NEXT: [3] %bb6.i.us {66,67} +; CHECK-NEXT: [3] %bb1.i.us {68,69} +; CHECK-NEXT: [3] %bb.i4.us.backedge {70,71} +; CHECK-NEXT: [3] %bb7.i.us {72,73} +; CHECK-NEXT: [3] %bb.i4.us {74,75} +; CHECK-NEXT: [3] %bb3.split.us {76,77} +; CHECK-NEXT: [3] %bb3 {78,79} +; CHECK-NEXT: [3] %bb32.preheader {80,81} +; CHECK-NEXT: [3] %_float32_unpack.exit8 {82,83} +; CHECK-NEXT: [3] %bb.i5 {84,85} +; CHECK-NEXT: [3] %_float32_unpack.exit {86,87} +; CHECK-NEXT: [3] %bb.i {88,89} +; CHECK-NEXT: [3] %bb {90,91} +; CHECK-NEXT: [2] %entry {93,94} +; CHECK-NEXT: [2] %bb3.i {95,96} diff --git a/llvm/test/Analysis/PostDominators/pr6047_d.ll b/llvm/test/Analysis/PostDominators/pr6047_d.ll index 4cfa88029ae..a3e9f16903c 100644 --- a/llvm/test/Analysis/PostDominators/pr6047_d.ll +++ b/llvm/test/Analysis/PostDominators/pr6047_d.ll @@ -21,4 +21,12 @@ bb35.loopexit3: bb35: ret void } -; CHECK: [4] %entry +; CHECK: Inorder PostDominator Tree: +; CHECK-NEXT: [1] <<exit node>> {0,15} +; CHECK-NEXT: [2] %bb35 {1,4} +; CHECK-NEXT: [3] %bb35.loopexit3 {2,3} +; CHECK-NEXT: [2] %c {5,12} +; CHECK-NEXT: [3] %b {6,7} +; CHECK-NEXT: [3] %entry {8,9} +; CHECK-NEXT: [3] %a {10,11} +; CHECK-NEXT: [2] %bb3.i {13,14} diff --git a/llvm/test/Analysis/RegionInfo/infinite_loop.ll b/llvm/test/Analysis/RegionInfo/infinite_loop.ll index 61abef8ff7a..06ab6cc7481 100644 --- a/llvm/test/Analysis/RegionInfo/infinite_loop.ll +++ b/llvm/test/Analysis/RegionInfo/infinite_loop.ll @@ -16,6 +16,4 @@ define void @normal_condition() nounwind { } ; CHECK-NOT: => ; CHECK: [0] 0 => <Function Return> -; CHECK: [1] 1 => 4 -; STAT: 2 region - The # of regions -; STAT: 1 region - The # of simple regions +; STAT: 1 region - The # of regions diff --git a/llvm/test/Analysis/RegionInfo/infinite_loop_2.ll b/llvm/test/Analysis/RegionInfo/infinite_loop_2.ll index 56e83cfdebb..6df5a9fe563 100644 --- a/llvm/test/Analysis/RegionInfo/infinite_loop_2.ll +++ b/llvm/test/Analysis/RegionInfo/infinite_loop_2.ll @@ -26,12 +26,11 @@ define void @normal_condition() nounwind { } ; CHECK-NOT: => ; CHECK: [0] 0 => <Function Return> -; CHECK: [1] 1 => 3 +; CHECK: [1] 5 => 6 ; STAT: 2 region - The # of regions -; STAT: 1 region - The # of simple regions -; BBIT: 0, 1, 2, 5, 11, 6, 12, 3, 4, -; BBIT: 1, 2, 5, 11, 6, 12, +; BBIT: 0, 1, 2, 5, 11, 6, 12, 3, 4, +; BBIT: 5, 11, 12, -; RNIT: 0, 1 => 3, 3, 4, -; RNIT: 1, 2, 5, 11, 6, 12, +; RNIT: 0, 1, 2, 5 => 6, 6, 3, 4, +; RNIT: 5, 11, 12, diff --git a/llvm/test/Analysis/RegionInfo/infinite_loop_3.ll b/llvm/test/Analysis/RegionInfo/infinite_loop_3.ll index 4538f0f7858..c1eda620c28 100644 --- a/llvm/test/Analysis/RegionInfo/infinite_loop_3.ll +++ b/llvm/test/Analysis/RegionInfo/infinite_loop_3.ll @@ -38,16 +38,15 @@ define void @normal_condition() nounwind { ret void } ; CHECK-NOT: => -; CHECK: [0] 0 => <Function Return> -; CHECK-NEXT: [1] 1 => 3 -; CHECK-NEXT: [1] 7 => 1 +; CHECK:[0] 0 => <Function Return> +; CHECK-NEXT: [1] 5 => 6 +; CHECK-NEXT: [1] 9 => 10 ; STAT: 3 region - The # of regions -; STAT: 2 region - The # of simple regions -; BBIT: 0, 7, 1, 2, 5, 11, 6, 12, 3, 4, 8, 9, 13, 10, 14, -; BBIT: 7, 8, 9, 13, 10, 14, -; BBIT: 1, 2, 5, 11, 6, 12, +; BBIT: 0, 7, 1, 2, 5, 11, 6, 12, 3, 4, 8, 9, 13, 10, 14, +; BBIT: 5, 11, 12, +; BBIT: 9, 13, 14, -; RNIT: 0, 7 => 1, 1 => 3, 3, 4, -; RNIT: 7, 8, 9, 13, 10, 14, -; RNIT: 1, 2, 5, 11, 6, 12, +; RNIT: 0, 7, 1, 2, 5 => 6, 6, 3, 4, 8, 9 => 10, 10, +; RNIT: 5, 11, 12, +; RNIT: 9, 13, 14, diff --git a/llvm/test/Analysis/RegionInfo/infinite_loop_4.ll b/llvm/test/Analysis/RegionInfo/infinite_loop_4.ll index 4ac9068f0dd..7aca6d79da3 100644 --- a/llvm/test/Analysis/RegionInfo/infinite_loop_4.ll +++ b/llvm/test/Analysis/RegionInfo/infinite_loop_4.ll @@ -38,12 +38,14 @@ define void @normal_condition() nounwind { } ; CHECK-NOT: => ; CHECK: [0] 0 => <Function Return> -; CHECK-NEXT: [1] 7 => 3 -; STAT: 2 region - The # of regions +; CHECK-NEXT: [1] 2 => 10 +; CHECK_NEXT: [2] 5 => 6 +; STAT: 3 region - The # of regions ; STAT: 1 region - The # of simple regions ; BBIT: 0, 7, 1, 2, 5, 11, 6, 10, 8, 9, 13, 14, 12, 3, 4, -; BBIT: 7, 1, 2, 5, 11, 6, 10, 8, 9, 13, 14, 12, - -; RNIT: 0, 7 => 3, 3, 4, -; RNIT: 7, 1, 2, 5, 11, 6, 10, 8, 9, 13, 14, 12, +; BBIT: 2, 5, 11, 6, 12, +; BBIT: 5, 11, 12, +; RNIT: 0, 7, 1, 2 => 10, 10, 8, 9, 13, 14, 3, 4, +; RNIT: 2, 5 => 6, 6, +; RNIT: 5, 11, 12, diff --git a/llvm/test/Analysis/RegionInfo/infinite_loop_5_a.ll b/llvm/test/Analysis/RegionInfo/infinite_loop_5_a.ll index b0e52861b7c..b0ffb9b8008 100644 --- a/llvm/test/Analysis/RegionInfo/infinite_loop_5_a.ll +++ b/llvm/test/Analysis/RegionInfo/infinite_loop_5_a.ll @@ -19,6 +19,5 @@ define void @normal_condition() nounwind { ; CHECK: Region tree: ; CHECK-NEXT: [0] 0 => <Function Return> -; CHECK-NEXT: [1] 7 => 3 ; CHECK-NEXT: End region tree diff --git a/llvm/test/Analysis/RegionInfo/infinite_loop_5_b.ll b/llvm/test/Analysis/RegionInfo/infinite_loop_5_b.ll index 49580c9de3d..9759ea873c5 100644 --- a/llvm/test/Analysis/RegionInfo/infinite_loop_5_b.ll +++ b/llvm/test/Analysis/RegionInfo/infinite_loop_5_b.ll @@ -21,5 +21,4 @@ define void @normal_condition() nounwind { ; CHECK: Region tree: ; CHECK-NEXT: [0] 0 => <Function Return> -; CHECK-NEXT: [1] 7 => 3 ; CHECK-NEXT: End region tree diff --git a/llvm/test/Transforms/StructurizeCFG/branch-on-argument.ll b/llvm/test/Transforms/StructurizeCFG/branch-on-argument.ll index 386994f1fd9..cdd4b70592b 100644 --- a/llvm/test/Transforms/StructurizeCFG/branch-on-argument.ll +++ b/llvm/test/Transforms/StructurizeCFG/branch-on-argument.ll @@ -3,14 +3,17 @@ ; CHECK-LABEL: @invert_branch_on_arg_inf_loop( ; CHECK: entry: ; CHECK: %arg.inv = xor i1 %arg, true -; CHECK: phi i1 [ false, %Flow1 ], [ %arg.inv, %entry ] define void @invert_branch_on_arg_inf_loop(i32 addrspace(1)* %out, i1 %arg) { entry: - br i1 %arg, label %for.end, label %for.body + br i1 %arg, label %for.end, label %sesestart +sesestart: + br label %for.body for.body: ; preds = %entry, %for.body store i32 999, i32 addrspace(1)* %out, align 4 - br label %for.body + br i1 %arg, label %for.body, label %seseend +seseend: + ret void for.end: ; preds = %Flow ret void diff --git a/llvm/test/Transforms/StructurizeCFG/no-branch-to-entry.ll b/llvm/test/Transforms/StructurizeCFG/no-branch-to-entry.ll index 1db1060ca82..cda890faa35 100644 --- a/llvm/test/Transforms/StructurizeCFG/no-branch-to-entry.ll +++ b/llvm/test/Transforms/StructurizeCFG/no-branch-to-entry.ll @@ -1,3 +1,4 @@ +; XFAIL: * ; RUN: opt -S -o - -structurizecfg -verify-dom-info < %s | FileCheck %s ; CHECK-LABEL: @no_branch_to_entry_undef( |