mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-12 03:32:10 +00:00
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:
parent
e1beb8f59d
commit
fcb81f5f4c
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user