[llvm] r296812 - Revert "Fix PR 24415 (at least), by making our post-dominator tree behavior sane."
Tobias Grosser via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 2 13:08:37 PST 2017
Author: grosser
Date: Thu Mar 2 15:08:37 2017
New Revision: 296812
URL: http://llvm.org/viewvc/llvm-project?rev=296812&view=rev
Log:
Revert "Fix PR 24415 (at least), by making our post-dominator tree behavior sane."
and also "clang-format GenericDomTreeConstruction.h, since the current
formatting makes it look like their is a bug in the loop indentation, and there
is not"
This reverts commit r296535.
There are still some open design questions which I would like to discuss. I
revert this for Daniel (who gave the OK), as he is on vacation.
Removed:
llvm/trunk/test/Analysis/PostDominators/pr24415.ll
Modified:
llvm/trunk/include/llvm/Support/GenericDomTree.h
llvm/trunk/include/llvm/Support/GenericDomTreeConstruction.h
llvm/trunk/lib/Transforms/Scalar/ADCE.cpp
llvm/trunk/test/Analysis/PostDominators/pr6047_a.ll
llvm/trunk/test/Analysis/PostDominators/pr6047_b.ll
llvm/trunk/test/Analysis/PostDominators/pr6047_c.ll
llvm/trunk/test/Analysis/PostDominators/pr6047_d.ll
llvm/trunk/test/Analysis/RegionInfo/infinite_loop.ll
llvm/trunk/test/Analysis/RegionInfo/infinite_loop_2.ll
llvm/trunk/test/Analysis/RegionInfo/infinite_loop_3.ll
llvm/trunk/test/Analysis/RegionInfo/infinite_loop_4.ll
llvm/trunk/test/Analysis/RegionInfo/infinite_loop_5_a.ll
llvm/trunk/test/Analysis/RegionInfo/infinite_loop_5_b.ll
llvm/trunk/test/Transforms/StructurizeCFG/branch-on-argument.ll
llvm/trunk/test/Transforms/StructurizeCFG/no-branch-to-entry.ll
Modified: llvm/trunk/include/llvm/Support/GenericDomTree.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/GenericDomTree.h?rev=296812&r1=296811&r2=296812&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Support/GenericDomTree.h (original)
+++ llvm/trunk/include/llvm/Support/GenericDomTree.h Thu Mar 2 15:08:37 2017
@@ -778,12 +778,22 @@ 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);
}
}
Modified: llvm/trunk/include/llvm/Support/GenericDomTreeConstruction.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/GenericDomTreeConstruction.h?rev=296812&r1=296811&r2=296812&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Support/GenericDomTreeConstruction.h (original)
+++ llvm/trunk/include/llvm/Support/GenericDomTreeConstruction.h Thu Mar 2 15:08:37 2017
@@ -25,7 +25,6 @@
#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"
@@ -40,10 +39,8 @@ public:
df_iterator_dom_storage(BaseSet &Storage) : Storage(Storage) {}
typedef typename BaseSet::iterator iterator;
- std::pair<iterator, bool> insert(NodeRef To) {
- auto Result = Storage.insert({To, InfoType()});
-
- return Result;
+ std::pair<iterator, bool> insert(NodeRef N) {
+ return Storage.insert({N, InfoType()});
}
void completed(NodeRef) {}
@@ -58,6 +55,7 @@ unsigned ReverseDFSPass(DominatorTreeBas
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;
@@ -69,6 +67,11 @@ unsigned ReverseDFSPass(DominatorTreeBas
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;
}
@@ -139,77 +142,34 @@ 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 NeedFakeRoot = DT.isPostDominator();
- // If this is post dominators, push a fake node to start
- if (NeedFakeRoot) {
+ bool MultipleRoots = (DT.Roots.size() > 1);
+ if (MultipleRoots) {
auto &BBInfo = DT.Info[nullptr];
BBInfo.DFSNum = BBInfo.Semi = ++N;
BBInfo.Label = nullptr;
- DT.Vertex.push_back(nullptr); // Vertex[n] = V;
- } else {
- // The root is the entry block of the CFG
- DT.addRoot(FuncGraphT::getEntryNode(&F));
+
+ DT.Vertex.push_back(nullptr); // Vertex[n] = V;
}
// Step #1: Number blocks in depth-first order and initialize variables used
// in later stages of the algorithm.
- 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);
- }
- }
- }
+ 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, GraphTraits<FuncT *>::getEntryNode(&F), N);
+ N = DFSPass<GraphT>(DT, DT.Roots[0], 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
@@ -274,11 +234,13 @@ void Calculate(DominatorTreeBaseByGraphT
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 = NeedFakeRoot ? nullptr : DT.Roots[0];
+ typename GraphT::NodeRef Root = !MultipleRoots ? DT.Roots[0] : nullptr;
DT.RootNode =
(DT.DomTreeNodes[Root] =
Modified: llvm/trunk/lib/Transforms/Scalar/ADCE.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/ADCE.cpp?rev=296812&r1=296811&r2=296812&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/ADCE.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/ADCE.cpp Thu Mar 2 15:08:37 2017
@@ -253,23 +253,46 @@ void AggressiveDeadCodeElimination::init
}
}
- // 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';);
+ // 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;
+ }
+ }
- // This child is something else, like an infinite loop.
- for (auto DFNode : depth_first(PDTChild))
- markLive(BlockInfo[DFNode->getBlock()].Terminator);
+ // 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()
+ << '\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;
+ }
}
// Treat the entry block as always live
Removed: llvm/trunk/test/Analysis/PostDominators/pr24415.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/PostDominators/pr24415.ll?rev=296811&view=auto
==============================================================================
--- llvm/trunk/test/Analysis/PostDominators/pr24415.ll (original)
+++ llvm/trunk/test/Analysis/PostDominators/pr24415.ll (removed)
@@ -1,18 +0,0 @@
-; 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}
Modified: llvm/trunk/test/Analysis/PostDominators/pr6047_a.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/PostDominators/pr6047_a.ll?rev=296812&r1=296811&r2=296812&view=diff
==============================================================================
--- llvm/trunk/test/Analysis/PostDominators/pr6047_a.ll (original)
+++ llvm/trunk/test/Analysis/PostDominators/pr6047_a.ll Thu Mar 2 15:08:37 2017
@@ -12,9 +12,4 @@ bb35.loopexit3:
bb35:
ret void
}
-;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}
+; CHECK: [3] %entry
Modified: llvm/trunk/test/Analysis/PostDominators/pr6047_b.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/PostDominators/pr6047_b.ll?rev=296812&r1=296811&r2=296812&view=diff
==============================================================================
--- llvm/trunk/test/Analysis/PostDominators/pr6047_b.ll (original)
+++ llvm/trunk/test/Analysis/PostDominators/pr6047_b.ll Thu Mar 2 15:08:37 2017
@@ -16,10 +16,4 @@ bb35.loopexit3:
bb35:
ret void
}
-; 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}
+; CHECK: [4] %entry
Modified: llvm/trunk/test/Analysis/PostDominators/pr6047_c.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/PostDominators/pr6047_c.ll?rev=296812&r1=296811&r2=296812&view=diff
==============================================================================
--- llvm/trunk/test/Analysis/PostDominators/pr6047_c.ll (original)
+++ llvm/trunk/test/Analysis/PostDominators/pr6047_c.ll Thu Mar 2 15:08:37 2017
@@ -144,53 +144,4 @@ bb35.loopexit3:
bb35:
ret void
}
-; 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}
+; CHECK: [3] %entry
Modified: llvm/trunk/test/Analysis/PostDominators/pr6047_d.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/PostDominators/pr6047_d.ll?rev=296812&r1=296811&r2=296812&view=diff
==============================================================================
--- llvm/trunk/test/Analysis/PostDominators/pr6047_d.ll (original)
+++ llvm/trunk/test/Analysis/PostDominators/pr6047_d.ll Thu Mar 2 15:08:37 2017
@@ -21,12 +21,4 @@ bb35.loopexit3:
bb35:
ret void
}
-; 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}
+; CHECK: [4] %entry
Modified: llvm/trunk/test/Analysis/RegionInfo/infinite_loop.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/RegionInfo/infinite_loop.ll?rev=296812&r1=296811&r2=296812&view=diff
==============================================================================
--- llvm/trunk/test/Analysis/RegionInfo/infinite_loop.ll (original)
+++ llvm/trunk/test/Analysis/RegionInfo/infinite_loop.ll Thu Mar 2 15:08:37 2017
@@ -16,4 +16,6 @@ define void @normal_condition() nounwind
}
; CHECK-NOT: =>
; CHECK: [0] 0 => <Function Return>
-; STAT: 1 region - The # of regions
+; CHECK: [1] 1 => 4
+; STAT: 2 region - The # of regions
+; STAT: 1 region - The # of simple regions
Modified: llvm/trunk/test/Analysis/RegionInfo/infinite_loop_2.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/RegionInfo/infinite_loop_2.ll?rev=296812&r1=296811&r2=296812&view=diff
==============================================================================
--- llvm/trunk/test/Analysis/RegionInfo/infinite_loop_2.ll (original)
+++ llvm/trunk/test/Analysis/RegionInfo/infinite_loop_2.ll Thu Mar 2 15:08:37 2017
@@ -26,11 +26,12 @@ define void @normal_condition() nounwind
}
; CHECK-NOT: =>
; CHECK: [0] 0 => <Function Return>
-; CHECK: [1] 5 => 6
+; CHECK: [1] 1 => 3
; STAT: 2 region - The # of regions
+; STAT: 1 region - The # of simple regions
-; BBIT: 0, 1, 2, 5, 11, 6, 12, 3, 4,
-; BBIT: 5, 11, 12,
+; BBIT: 0, 1, 2, 5, 11, 6, 12, 3, 4,
+; BBIT: 1, 2, 5, 11, 6, 12,
-; RNIT: 0, 1, 2, 5 => 6, 6, 3, 4,
-; RNIT: 5, 11, 12,
+; RNIT: 0, 1 => 3, 3, 4,
+; RNIT: 1, 2, 5, 11, 6, 12,
Modified: llvm/trunk/test/Analysis/RegionInfo/infinite_loop_3.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/RegionInfo/infinite_loop_3.ll?rev=296812&r1=296811&r2=296812&view=diff
==============================================================================
--- llvm/trunk/test/Analysis/RegionInfo/infinite_loop_3.ll (original)
+++ llvm/trunk/test/Analysis/RegionInfo/infinite_loop_3.ll Thu Mar 2 15:08:37 2017
@@ -38,15 +38,16 @@ define void @normal_condition() nounwind
ret void
}
; CHECK-NOT: =>
-; CHECK:[0] 0 => <Function Return>
-; CHECK-NEXT: [1] 5 => 6
-; CHECK-NEXT: [1] 9 => 10
+; CHECK: [0] 0 => <Function Return>
+; CHECK-NEXT: [1] 1 => 3
+; CHECK-NEXT: [1] 7 => 1
; 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: 5, 11, 12,
-; BBIT: 9, 13, 14,
+; 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,
-; RNIT: 0, 7, 1, 2, 5 => 6, 6, 3, 4, 8, 9 => 10, 10,
-; RNIT: 5, 11, 12,
-; RNIT: 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,
Modified: llvm/trunk/test/Analysis/RegionInfo/infinite_loop_4.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/RegionInfo/infinite_loop_4.ll?rev=296812&r1=296811&r2=296812&view=diff
==============================================================================
--- llvm/trunk/test/Analysis/RegionInfo/infinite_loop_4.ll (original)
+++ llvm/trunk/test/Analysis/RegionInfo/infinite_loop_4.ll Thu Mar 2 15:08:37 2017
@@ -38,14 +38,12 @@ define void @normal_condition() nounwind
}
; CHECK-NOT: =>
; CHECK: [0] 0 => <Function Return>
-; CHECK-NEXT: [1] 2 => 10
-; CHECK_NEXT: [2] 5 => 6
-; STAT: 3 region - The # of regions
+; CHECK-NEXT: [1] 7 => 3
+; STAT: 2 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: 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,
+; 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,
Modified: llvm/trunk/test/Analysis/RegionInfo/infinite_loop_5_a.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/RegionInfo/infinite_loop_5_a.ll?rev=296812&r1=296811&r2=296812&view=diff
==============================================================================
--- llvm/trunk/test/Analysis/RegionInfo/infinite_loop_5_a.ll (original)
+++ llvm/trunk/test/Analysis/RegionInfo/infinite_loop_5_a.ll Thu Mar 2 15:08:37 2017
@@ -19,5 +19,6 @@ define void @normal_condition() nounwind
; CHECK: Region tree:
; CHECK-NEXT: [0] 0 => <Function Return>
+; CHECK-NEXT: [1] 7 => 3
; CHECK-NEXT: End region tree
Modified: llvm/trunk/test/Analysis/RegionInfo/infinite_loop_5_b.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/RegionInfo/infinite_loop_5_b.ll?rev=296812&r1=296811&r2=296812&view=diff
==============================================================================
--- llvm/trunk/test/Analysis/RegionInfo/infinite_loop_5_b.ll (original)
+++ llvm/trunk/test/Analysis/RegionInfo/infinite_loop_5_b.ll Thu Mar 2 15:08:37 2017
@@ -21,4 +21,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
Modified: llvm/trunk/test/Transforms/StructurizeCFG/branch-on-argument.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/StructurizeCFG/branch-on-argument.ll?rev=296812&r1=296811&r2=296812&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/StructurizeCFG/branch-on-argument.ll (original)
+++ llvm/trunk/test/Transforms/StructurizeCFG/branch-on-argument.ll Thu Mar 2 15:08:37 2017
@@ -3,17 +3,14 @@
; 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 %sesestart
-sesestart:
- br label %for.body
+ br i1 %arg, label %for.end, label %for.body
for.body: ; preds = %entry, %for.body
store i32 999, i32 addrspace(1)* %out, align 4
- br i1 %arg, label %for.body, label %seseend
-seseend:
- ret void
+ br label %for.body
for.end: ; preds = %Flow
ret void
Modified: llvm/trunk/test/Transforms/StructurizeCFG/no-branch-to-entry.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/StructurizeCFG/no-branch-to-entry.ll?rev=296812&r1=296811&r2=296812&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/StructurizeCFG/no-branch-to-entry.ll (original)
+++ llvm/trunk/test/Transforms/StructurizeCFG/no-branch-to-entry.ll Thu Mar 2 15:08:37 2017
@@ -1,4 +1,3 @@
-; XFAIL: *
; RUN: opt -S -o - -structurizecfg -verify-dom-info < %s | FileCheck %s
; CHECK-LABEL: @no_branch_to_entry_undef(
More information about the llvm-commits
mailing list