summaryrefslogtreecommitdiff
path: root/lib/Analysis/ScalarEvolutionExpander.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2012-02-21 01:19:51 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2012-02-21 01:19:51 +0000
commit4b04578d65e38cdb5077de2498889e4a174ccdfd (patch)
tree9a20031ede8300ee539174a428bc2715715a815f /lib/Analysis/ScalarEvolutionExpander.cpp
parentfd6d3217d3b577e704ff4826775b5938c23b9e73 (diff)
downloadllvm-4b04578d65e38cdb5077de2498889e4a174ccdfd.tar.gz
llvm-4b04578d65e38cdb5077de2498889e4a174ccdfd.tar.bz2
llvm-4b04578d65e38cdb5077de2498889e4a174ccdfd.tar.xz
It turns out that with the current scev organization ReuseOrCreateCast cannot
know where users will be added. Because of this, it cannot use Builder.GetInsertPoint at all. This patch * removes the FIXME about adding the assert. * adds a comment explaining hy we don't have one. * removes a broken logic that only works for some callers and is not needed since r150884. * adds an assert to caller that would have caught the bug fixed by r150884. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@151015 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/ScalarEvolutionExpander.cpp')
-rw-r--r--lib/Analysis/ScalarEvolutionExpander.cpp18
1 files changed, 9 insertions, 9 deletions
diff --git a/lib/Analysis/ScalarEvolutionExpander.cpp b/lib/Analysis/ScalarEvolutionExpander.cpp
index 852c7a0824..345c8a700b 100644
--- a/lib/Analysis/ScalarEvolutionExpander.cpp
+++ b/lib/Analysis/ScalarEvolutionExpander.cpp
@@ -31,13 +31,11 @@ using namespace llvm;
Value *SCEVExpander::ReuseOrCreateCast(Value *V, Type *Ty,
Instruction::CastOps Op,
BasicBlock::iterator IP) {
- // All new or reused instructions must strictly dominate the Builder's
- // InsertPt to ensure that the expression's expansion dominates its uses.
- // Assert that the requested insertion point works at least for new
- // instructions.
-
- // FIXME: disabled to make the bots happy.
- //assert(SE.DT->dominates(IP, Builder.GetInsertPoint()));
+ // All new or reused instructions must strictly dominate their uses.
+ // It would be nice to assert this here, but we don't always know where
+ // the next instructions will be added as the the caller can move the
+ // Builder's InsertPt before creating them and we might be called with
+ // an invalid InsertPt.
// Check to see if there is already a cast!
for (Value::use_iterator UI = V->use_begin(), E = V->use_end();
@@ -47,8 +45,7 @@ Value *SCEVExpander::ReuseOrCreateCast(Value *V, Type *Ty,
if (CastInst *CI = dyn_cast<CastInst>(U))
if (CI->getOpcode() == Op) {
// If the cast isn't where we want it, fix it.
- if (BasicBlock::iterator(CI) != IP
- || IP == Builder.GetInsertPoint()) {
+ if (BasicBlock::iterator(CI) != IP) {
// Create a new cast, and leave the old cast in place in case
// it is being used as an insert point. Clear its operand
// so that it doesn't hold anything live.
@@ -506,6 +503,9 @@ Value *SCEVExpander::expandAddToGEP(const SCEV *const *op_begin,
V = InsertNoopCastOfTo(V,
Type::getInt8PtrTy(Ty->getContext(), PTy->getAddressSpace()));
+ Instruction *Inst = dyn_cast<Instruction>(V);
+ assert(!Inst || SE.DT->properlyDominates(Inst, Builder.GetInsertPoint()));
+
// Expand the operands for a plain byte offset.
Value *Idx = expandCodeFor(SE.getAddExpr(Ops), Ty);