diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2012-02-21 01:19:51 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2012-02-21 01:19:51 +0000 |
commit | 4b04578d65e38cdb5077de2498889e4a174ccdfd (patch) | |
tree | 9a20031ede8300ee539174a428bc2715715a815f | |
parent | fd6d3217d3b577e704ff4826775b5938c23b9e73 (diff) | |
download | external_llvm-4b04578d65e38cdb5077de2498889e4a174ccdfd.zip external_llvm-4b04578d65e38cdb5077de2498889e4a174ccdfd.tar.gz external_llvm-4b04578d65e38cdb5077de2498889e4a174ccdfd.tar.bz2 |
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
-rw-r--r-- | lib/Analysis/ScalarEvolutionExpander.cpp | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/lib/Analysis/ScalarEvolutionExpander.cpp b/lib/Analysis/ScalarEvolutionExpander.cpp index 852c7a0..345c8a7 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); |