aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2012-03-25 03:29:25 +0000
committerChandler Carruth <chandlerc@gmail.com>2012-03-25 03:29:25 +0000
commitacdae3e25a03e4e08039cb18f50b7788f71c0b2e (patch)
tree474664950af5922599157c122cbe9c84b011f5bd
parenteede6c9075a3a872e0ea00bbd71ab6fa88b677cd (diff)
downloadexternal_llvm-acdae3e25a03e4e08039cb18f50b7788f71c0b2e.zip
external_llvm-acdae3e25a03e4e08039cb18f50b7788f71c0b2e.tar.gz
external_llvm-acdae3e25a03e4e08039cb18f50b7788f71c0b2e.tar.bz2
Add an asserting ValueHandle to the block simplification code which will
fire if anything ever invalidates the assumption of a terminator instruction being unchanged throughout the routine. I've convinced myself that the current definition of simplification precludes such a transformation, so I think getting some asserts coverage that we don't violate this agreement is sufficient to make this code safe for the foreseeable future. Comments to the contrary or other suggestions are of course welcome. =] The bots are now happy with this code though, so it appears the bug here has indeed been fixed. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153401 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Transforms/Utils/Local.cpp9
1 files changed, 9 insertions, 0 deletions
diff --git a/lib/Transforms/Utils/Local.cpp b/lib/Transforms/Utils/Local.cpp
index 96c6933..b51dd29 100644
--- a/lib/Transforms/Utils/Local.cpp
+++ b/lib/Transforms/Utils/Local.cpp
@@ -355,6 +355,15 @@ bool llvm::RecursivelyDeleteDeadPHINode(PHINode *PN) {
/// instructions in other blocks as well in this block.
bool llvm::SimplifyInstructionsInBlock(BasicBlock *BB, const TargetData *TD) {
bool MadeChange = false;
+
+#ifndef NDEBUG
+ // In debug builds, ensure that the terminator of the block is never replaced
+ // or deleted by these simplifications. The idea of simplification is that it
+ // cannot introduce new instructions, and there is no way to replace the
+ // terminator of a block without introducing a new instruction.
+ AssertingVH<Instruction> TerminatorVH(--BB->end());
+#endif
+
for (BasicBlock::iterator BI = BB->begin(), E = --BB->end(); BI != E; ) {
assert(!BI->isTerminator());
Instruction *Inst = BI++;