Implement IndVarsSimplify/pointer-indvars.ll, transforming pointer

arithmetic into "array subscripts"


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10580 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2003-12-22 05:02:01 +00:00
parent f045328dd1
commit 18b3c97bc7

View File

@ -17,8 +17,7 @@
#include "llvm/Transforms/Scalar.h" #include "llvm/Transforms/Scalar.h"
#include "llvm/Constants.h" #include "llvm/Constants.h"
#include "llvm/Type.h" #include "llvm/Type.h"
#include "llvm/iPHINode.h" #include "llvm/Instructions.h"
#include "llvm/iOther.h"
#include "llvm/Analysis/InductionVariable.h" #include "llvm/Analysis/InductionVariable.h"
#include "llvm/Analysis/LoopInfo.h" #include "llvm/Analysis/LoopInfo.h"
#include "llvm/Support/CFG.h" #include "llvm/Support/CFG.h"
@ -195,12 +194,12 @@ bool IndVarSimplify::runOnLoop(Loop *Loop) {
while (isa<PHINode>(AfterPHIIt)) ++AfterPHIIt; while (isa<PHINode>(AfterPHIIt)) ++AfterPHIIt;
// Don't do math with pointers...
const Type *IVTy = IV->Phi->getType();
if (isa<PointerType>(IVTy)) IVTy = Type::ULongTy;
// Don't modify the canonical indvar or unrecognized indvars... // Don't modify the canonical indvar or unrecognized indvars...
if (IV != Canonical && IV->InductionType != InductionVariable::Unknown) { if (IV != Canonical && IV->InductionType != InductionVariable::Unknown) {
const Type *IVTy = IV->Phi->getType();
if (isa<PointerType>(IVTy)) // If indexing into a pointer, make the
IVTy = TD->getIntPtrType(); // index the appropriate type.
Instruction *Val = IterCount; Instruction *Val = IterCount;
if (!isa<ConstantInt>(IV->Step) || // If the step != 1 if (!isa<ConstantInt>(IV->Step) || // If the step != 1
!cast<ConstantInt>(IV->Step)->equalsInt(1)) { !cast<ConstantInt>(IV->Step)->equalsInt(1)) {
@ -216,15 +215,26 @@ bool IndVarSimplify::runOnLoop(Loop *Loop) {
IV->Phi->getName()+"-scale", AfterPHIIt); IV->Phi->getName()+"-scale", AfterPHIIt);
} }
// If the start != 0 // If this is a pointer indvar...
if (IV->Start != Constant::getNullValue(IV->Start->getType())) { if (isa<PointerType>(IV->Phi->getType())) {
std::vector<Value*> Idx;
// FIXME: this should not be needed when we fix PR82!
if (Val->getType() != Type::LongTy)
Val = new CastInst(Val, Type::LongTy, Val->getName(), AfterPHIIt);
Idx.push_back(Val);
Val = new GetElementPtrInst(IV->Start, Idx,
IV->Phi->getName()+"-offset",
AfterPHIIt);
} else if (!isa<Constant>(IV->Start) || // If Start != 0...
!cast<Constant>(IV->Start)->isNullValue()) {
// If the types are not compatible, insert a cast now... // If the types are not compatible, insert a cast now...
if (Val->getType() != IVTy) if (Val->getType() != IVTy)
Val = new CastInst(Val, IVTy, Val->getName(), AfterPHIIt); Val = new CastInst(Val, IVTy, Val->getName(), AfterPHIIt);
if (IV->Start->getType() != IVTy) if (IV->Start->getType() != IVTy)
IV->Start = new CastInst(IV->Start, IVTy, IV->Start->getName(), IV->Start = new CastInst(IV->Start, IVTy, IV->Start->getName(),
AfterPHIIt); AfterPHIIt);
// Insert the instruction after the phi nodes... // Insert the instruction after the phi nodes...
Val = BinaryOperator::create(Instruction::Add, Val, IV->Start, Val = BinaryOperator::create(Instruction::Add, Val, IV->Start,
IV->Phi->getName()+"-offset", AfterPHIIt); IV->Phi->getName()+"-offset", AfterPHIIt);