forked from OSchip/llvm-project
Move common loop utility function isInductionPHI into LoopUtils.cpp
This patch refactors the definition of common utility function "isInductionPHI" to LoopUtils.cpp. This fixes compilation error when configured with -DBUILD_SHARED_LIBS=ON llvm-svn: 235577
This commit is contained in:
parent
112a7bf961
commit
24e6cc2de4
|
@ -16,6 +16,9 @@
|
||||||
#include "llvm/IR/PatternMatch.h"
|
#include "llvm/IR/PatternMatch.h"
|
||||||
#include "llvm/IR/ValueHandle.h"
|
#include "llvm/IR/ValueHandle.h"
|
||||||
#include "llvm/Support/Debug.h"
|
#include "llvm/Support/Debug.h"
|
||||||
|
#include "llvm/Analysis/ScalarEvolution.h"
|
||||||
|
#include "llvm/Analysis/ScalarEvolutionExpressions.h"
|
||||||
|
#include "llvm/IR/Module.h"
|
||||||
#include "llvm/Transforms/Utils/LoopUtils.h"
|
#include "llvm/Transforms/Utils/LoopUtils.h"
|
||||||
|
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
@ -451,3 +454,46 @@ ReductionDescriptor::createMinMaxOp(IRBuilder<> &Builder,
|
||||||
Value *Select = Builder.CreateSelect(Cmp, Left, Right, "rdx.minmax.select");
|
Value *Select = Builder.CreateSelect(Cmp, Left, Right, "rdx.minmax.select");
|
||||||
return Select;
|
return Select;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool llvm::isInductionPHI(PHINode *Phi, ScalarEvolution *SE,
|
||||||
|
ConstantInt *&StepValue) {
|
||||||
|
Type *PhiTy = Phi->getType();
|
||||||
|
// We only handle integer and pointer inductions variables.
|
||||||
|
if (!PhiTy->isIntegerTy() && !PhiTy->isPointerTy())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Check that the PHI is consecutive.
|
||||||
|
const SCEV *PhiScev = SE->getSCEV(Phi);
|
||||||
|
const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(PhiScev);
|
||||||
|
if (!AR) {
|
||||||
|
DEBUG(dbgs() << "LV: PHI is not a poly recurrence.\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const SCEV *Step = AR->getStepRecurrence(*SE);
|
||||||
|
// Calculate the pointer stride and check if it is consecutive.
|
||||||
|
const SCEVConstant *C = dyn_cast<SCEVConstant>(Step);
|
||||||
|
if (!C)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
ConstantInt *CV = C->getValue();
|
||||||
|
if (PhiTy->isIntegerTy()) {
|
||||||
|
StepValue = CV;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(PhiTy->isPointerTy() && "The PHI must be a pointer");
|
||||||
|
Type *PointerElementType = PhiTy->getPointerElementType();
|
||||||
|
// The pointer stride cannot be determined if the pointer element type is not
|
||||||
|
// sized.
|
||||||
|
if (!PointerElementType->isSized())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
const DataLayout &DL = Phi->getModule()->getDataLayout();
|
||||||
|
int64_t Size = static_cast<int64_t>(DL.getTypeAllocSize(PointerElementType));
|
||||||
|
int64_t CVSize = CV->getSExtValue();
|
||||||
|
if (CVSize % Size)
|
||||||
|
return false;
|
||||||
|
StepValue = ConstantInt::getSigned(CV->getType(), CVSize / Size);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
|
@ -3828,49 +3828,6 @@ bool LoopVectorizationLegality::canVectorizeMemory() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool llvm::isInductionPHI(PHINode *Phi, ScalarEvolution *SE,
|
|
||||||
ConstantInt *&StepValue) {
|
|
||||||
Type *PhiTy = Phi->getType();
|
|
||||||
// We only handle integer and pointer inductions variables.
|
|
||||||
if (!PhiTy->isIntegerTy() && !PhiTy->isPointerTy())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Check that the PHI is consecutive.
|
|
||||||
const SCEV *PhiScev = SE->getSCEV(Phi);
|
|
||||||
const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(PhiScev);
|
|
||||||
if (!AR) {
|
|
||||||
DEBUG(dbgs() << "LV: PHI is not a poly recurrence.\n");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const SCEV *Step = AR->getStepRecurrence(*SE);
|
|
||||||
// Calculate the pointer stride and check if it is consecutive.
|
|
||||||
const SCEVConstant *C = dyn_cast<SCEVConstant>(Step);
|
|
||||||
if (!C)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
ConstantInt *CV = C->getValue();
|
|
||||||
if (PhiTy->isIntegerTy()) {
|
|
||||||
StepValue = CV;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(PhiTy->isPointerTy() && "The PHI must be a pointer");
|
|
||||||
Type *PointerElementType = PhiTy->getPointerElementType();
|
|
||||||
// The pointer stride cannot be determined if the pointer element type is not
|
|
||||||
// sized.
|
|
||||||
if (!PointerElementType->isSized())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
const DataLayout &DL = Phi->getModule()->getDataLayout();
|
|
||||||
int64_t Size = static_cast<int64_t>(DL.getTypeAllocSize(PointerElementType));
|
|
||||||
int64_t CVSize = CV->getSExtValue();
|
|
||||||
if (CVSize % Size)
|
|
||||||
return false;
|
|
||||||
StepValue = ConstantInt::getSigned(CV->getType(), CVSize / Size);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
LoopVectorizationLegality::InductionKind
|
LoopVectorizationLegality::InductionKind
|
||||||
LoopVectorizationLegality::isInductionVariable(PHINode *Phi,
|
LoopVectorizationLegality::isInductionVariable(PHINode *Phi,
|
||||||
ConstantInt *&StepValue) {
|
ConstantInt *&StepValue) {
|
||||||
|
|
Loading…
Reference in New Issue