forked from OSchip/llvm-project
Generalize the ChangeCompareStride code, in preparation for
handling non-constant strides. No functionality change. llvm-svn: 65363
This commit is contained in:
parent
94ceb61574
commit
5d1f458f0f
|
@ -2133,15 +2133,12 @@ ICmpInst *LoopStrengthReduce::ChangeCompareStride(Loop *L, ICmpInst *Cond,
|
|||
return Cond;
|
||||
const SCEVConstant *SC = dyn_cast<SCEVConstant>(*CondStride);
|
||||
if (!SC) return Cond;
|
||||
ConstantInt *C = dyn_cast<ConstantInt>(Cond->getOperand(1));
|
||||
if (!C) return Cond;
|
||||
|
||||
ICmpInst::Predicate Predicate = Cond->getPredicate();
|
||||
int64_t CmpSSInt = SC->getValue()->getSExtValue();
|
||||
int64_t CmpVal = C->getValue().getSExtValue();
|
||||
unsigned BitWidth = C->getValue().getBitWidth();
|
||||
unsigned BitWidth = (*CondStride)->getBitWidth();
|
||||
uint64_t SignBit = 1ULL << (BitWidth-1);
|
||||
const Type *CmpTy = C->getType();
|
||||
const Type *CmpTy = Cond->getOperand(0)->getType();
|
||||
const Type *NewCmpTy = NULL;
|
||||
unsigned TyBits = CmpTy->getPrimitiveSizeInBits();
|
||||
unsigned NewTyBits = 0;
|
||||
|
@ -2149,6 +2146,11 @@ ICmpInst *LoopStrengthReduce::ChangeCompareStride(Loop *L, ICmpInst *Cond,
|
|||
Value *NewCmpLHS = NULL;
|
||||
Value *NewCmpRHS = NULL;
|
||||
int64_t Scale = 1;
|
||||
SCEVHandle NewOffset = SE->getIntegerSCEV(0, UIntPtrTy);
|
||||
std::stable_sort(StrideOrder.begin(), StrideOrder.end(), StrideCompare());
|
||||
|
||||
if (ConstantInt *C = dyn_cast<ConstantInt>(Cond->getOperand(1))) {
|
||||
int64_t CmpVal = C->getValue().getSExtValue();
|
||||
|
||||
// Check stride constant and the comparision constant signs to detect
|
||||
// overflow.
|
||||
|
@ -2156,7 +2158,6 @@ ICmpInst *LoopStrengthReduce::ChangeCompareStride(Loop *L, ICmpInst *Cond,
|
|||
return Cond;
|
||||
|
||||
// Look for a suitable stride / iv as replacement.
|
||||
std::stable_sort(StrideOrder.begin(), StrideOrder.end(), StrideCompare());
|
||||
for (unsigned i = 0, e = StrideOrder.size(); i != e; ++i) {
|
||||
std::map<SCEVHandle, IVUsersOfOneStride>::iterator SI =
|
||||
IVUsesByStride.find(StrideOrder[i]);
|
||||
|
@ -2244,8 +2245,14 @@ ICmpInst *LoopStrengthReduce::ChangeCompareStride(Loop *L, ICmpInst *Cond,
|
|||
NewCmpRHS = SCEVExpander::InsertCastOfTo(Instruction::IntToPtr,
|
||||
NewCmpRHS, NewCmpTy);
|
||||
}
|
||||
NewOffset = TyBits == NewTyBits
|
||||
? SE->getMulExpr(CondUse->Offset,
|
||||
SE->getConstant(ConstantInt::get(CmpTy, Scale)))
|
||||
: SE->getConstant(ConstantInt::get(NewCmpTy,
|
||||
cast<SCEVConstant>(CondUse->Offset)->getValue()->getSExtValue()*Scale));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Forgo this transformation if it the increment happens to be
|
||||
// unfortunately positioned after the condition, and the condition
|
||||
|
@ -2275,11 +2282,6 @@ ICmpInst *LoopStrengthReduce::ChangeCompareStride(Loop *L, ICmpInst *Cond,
|
|||
OldCond->eraseFromParent();
|
||||
|
||||
IVUsesByStride[*CondStride].Users.pop_back();
|
||||
SCEVHandle NewOffset = TyBits == NewTyBits
|
||||
? SE->getMulExpr(CondUse->Offset,
|
||||
SE->getConstant(ConstantInt::get(CmpTy, Scale)))
|
||||
: SE->getConstant(ConstantInt::get(NewCmpTy,
|
||||
cast<SCEVConstant>(CondUse->Offset)->getValue()->getSExtValue()*Scale));
|
||||
IVUsesByStride[*NewStride].addUser(NewOffset, Cond, NewCmpLHS);
|
||||
CondUse = &IVUsesByStride[*NewStride].Users.back();
|
||||
CondStride = NewStride;
|
||||
|
|
Loading…
Reference in New Issue