From 15002a2b528e04a5edcfccbec392f5d6b19f7f6a Mon Sep 17 00:00:00 2001 From: Eli Friedman Date: Thu, 21 May 2009 21:47:54 +0000 Subject: [PATCH] Fix broken logic in DominatorTreeBase::Split. Part of PR4238. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@72231 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Analysis/Dominators.h | 47 +++---------------- .../2009-01-15-RecordVariableCrash.ll | 2 +- .../LCSSA/2006-10-31-UnreachableBlock-2.ll | 2 +- 3 files changed, 9 insertions(+), 42 deletions(-) diff --git a/include/llvm/Analysis/Dominators.h b/include/llvm/Analysis/Dominators.h index b9ac2805c9f..b405f5b71ed 100644 --- a/include/llvm/Analysis/Dominators.h +++ b/include/llvm/Analysis/Dominators.h @@ -251,49 +251,16 @@ protected: assert(!PredBlocks.empty() && "No predblocks??"); - // The newly inserted basic block will dominate existing basic blocks iff the - // PredBlocks dominate all of the non-pred blocks. If all predblocks dominate - // the non-pred blocks, then they all must be the same block! - // bool NewBBDominatesNewBBSucc = true; - { - typename GraphT::NodeType* OnePred = PredBlocks[0]; - size_t i = 1, e = PredBlocks.size(); - for (i = 1; !DT.isReachableFromEntry(OnePred); ++i) { - assert(i != e && "Didn't find reachable pred?"); - OnePred = PredBlocks[i]; + for (typename GraphTraits >::ChildIteratorType PI = + GraphTraits >::child_begin(NewBBSucc), + E = GraphTraits >::child_end(NewBBSucc); PI != E; ++PI) + if (*PI != NewBB && !DT.dominates(NewBBSucc, *PI) && + DT.isReachableFromEntry(*PI)) { + NewBBDominatesNewBBSucc = false; + break; } - for (; i != e; ++i) - if (PredBlocks[i] != OnePred && DT.isReachableFromEntry(OnePred)) { - NewBBDominatesNewBBSucc = false; - break; - } - - if (NewBBDominatesNewBBSucc) - for (typename GraphTraits >::ChildIteratorType PI = - GraphTraits >::child_begin(NewBBSucc), - E = GraphTraits >::child_end(NewBBSucc); PI != E; ++PI) - if (*PI != NewBB && !DT.dominates(NewBBSucc, *PI)) { - NewBBDominatesNewBBSucc = false; - break; - } - } - - // The other scenario where the new block can dominate its successors are when - // all predecessors of NewBBSucc that are not NewBB are dominated by NewBBSucc - // already. - if (!NewBBDominatesNewBBSucc) { - NewBBDominatesNewBBSucc = true; - for (typename GraphTraits >::ChildIteratorType PI = - GraphTraits >::child_begin(NewBBSucc), - E = GraphTraits >::child_end(NewBBSucc); PI != E; ++PI) - if (*PI != NewBB && !DT.dominates(NewBBSucc, *PI)) { - NewBBDominatesNewBBSucc = false; - break; - } - } - // Find NewBB's immediate dominator and create new dominator tree node for // NewBB. NodeT *NewBBIDom = 0; diff --git a/test/DebugInfo/2009-01-15-RecordVariableCrash.ll b/test/DebugInfo/2009-01-15-RecordVariableCrash.ll index 0fa216700dc..68268bac49f 100644 --- a/test/DebugInfo/2009-01-15-RecordVariableCrash.ll +++ b/test/DebugInfo/2009-01-15-RecordVariableCrash.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | llc -f -o /dev/null +; RUN: llvm-as < %s | llc -f -o /dev/null -verify-dom-info %llvm.dbg.anchor.type = type { i32, i32 } %llvm.dbg.basictype.type = type { i32, { }*, i8*, { }*, i32, i64, i64, i64, i32, i32, i8*, i8* } %llvm.dbg.compile_unit.type = type { i32, { }*, i32, i8*, i8*, i8* } diff --git a/test/Transforms/LCSSA/2006-10-31-UnreachableBlock-2.ll b/test/Transforms/LCSSA/2006-10-31-UnreachableBlock-2.ll index b85e6c36028..bececb18764 100644 --- a/test/Transforms/LCSSA/2006-10-31-UnreachableBlock-2.ll +++ b/test/Transforms/LCSSA/2006-10-31-UnreachableBlock-2.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | opt -lcssa -disable-output +; RUN: llvm-as < %s | opt -lcssa -disable-output -verify-dom-info ; PR977 ; END. declare i32 @opost_block()