Fix an extremely serious thinko I made in revision 1.60 of this file.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@13106 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2004-04-22 14:59:40 +00:00
parent e1beb8f59d
commit fcb81f5f4c

View File

@ -390,8 +390,10 @@ void IndVarSimplify::runOnLoop(Loop *L) {
// Compute the type of the largest recurrence expression. // Compute the type of the largest recurrence expression.
// //
const Type *LargestType = IndVars[0].first->getType(); const Type *LargestType = IndVars[0].first->getType();
bool DifferingSizes = false;
for (unsigned i = 1, e = IndVars.size(); i != e; ++i) { for (unsigned i = 1, e = IndVars.size(); i != e; ++i) {
const Type *Ty = IndVars[i].first->getType(); const Type *Ty = IndVars[i].first->getType();
DifferingSizes |= Ty->getPrimitiveSize() != LargestType->getPrimitiveSize();
if (Ty->getPrimitiveSize() > LargestType->getPrimitiveSize()) if (Ty->getPrimitiveSize() > LargestType->getPrimitiveSize())
LargestType = Ty; LargestType = Ty;
} }
@ -415,29 +417,37 @@ void IndVarSimplify::runOnLoop(Loop *L) {
BasicBlock::iterator InsertPt = Header->begin(); BasicBlock::iterator InsertPt = Header->begin();
while (isa<PHINode>(InsertPt)) ++InsertPt; while (isa<PHINode>(InsertPt)) ++InsertPt;
// If there were induction variables of other sizes, cast the primary
// induction variable to the right size for them, avoiding the need for the
// code evaluation methods to insert induction variables of different sizes.
if (DifferingSizes) {
bool InsertedSizes[17] = { false };
InsertedSizes[LargestType->getPrimitiveSize()] = true;
for (unsigned i = 0, e = IndVars.size(); i != e; ++i)
if (!InsertedSizes[IndVars[i].first->getType()->getPrimitiveSize()]) {
PHINode *PN = IndVars[i].first;
InsertedSizes[PN->getType()->getPrimitiveSize()] = true;
Instruction *New = new CastInst(IndVar,
PN->getType()->getUnsignedVersion(),
"indvar", InsertPt);
Rewriter.addInsertedValue(New, SE->getSCEV(New));
}
}
// If there were induction variables of other sizes, cast the primary // If there were induction variables of other sizes, cast the primary
// induction variable to the right size for them, avoiding the need for the // induction variable to the right size for them, avoiding the need for the
// code evaluation methods to insert induction variables of different sizes. // code evaluation methods to insert induction variables of different sizes.
std::map<unsigned, Value*> InsertedSizes; std::map<unsigned, Value*> InsertedSizes;
InsertedSizes[LargestType->getPrimitiveSize()] = IndVar;
while (!IndVars.empty()) { while (!IndVars.empty()) {
PHINode *PN = IndVars.back().first; PHINode *PN = IndVars.back().first;
Value *NewVal = Rewriter.ExpandCodeFor(IndVars.back().second, InsertPt,
const Type *Ty = PN->getType()->getUnsignedVersion(); PN->getType());
Value *&IV = InsertedSizes[Ty->getPrimitiveSize()]; std::string Name = PN->getName();
if (IV == 0) { PN->setName("");
// Insert a new cast instruction, which will hold this recurrence. NewVal->setName(Name);
std::string Name = PN->getName();
PN->setName("");
IV = new CastInst(IndVar, Ty, Name, InsertPt);
}
Value *V = IV;
if (PN->getType() != Ty)
V = new CastInst(V, PN->getType(), V->getName(), InsertPt);
// Replace the old PHI Node with the inserted computation. // Replace the old PHI Node with the inserted computation.
PN->replaceAllUsesWith(V); PN->replaceAllUsesWith(NewVal);
DeadInsts.insert(PN); DeadInsts.insert(PN);
IndVars.pop_back(); IndVars.pop_back();
++NumRemoved; ++NumRemoved;
@ -469,6 +479,5 @@ void IndVarSimplify::runOnLoop(Loop *L) {
} }
} }
DeleteTriviallyDeadInstructions(DeadInsts); DeleteTriviallyDeadInstructions(DeadInsts);
} }