mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-09-30 19:55:11 +00:00
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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235577 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7ab8b5573e
commit
9311f5b6fe
@ -16,6 +16,9 @@
|
||||
#include "llvm/IR/PatternMatch.h"
|
||||
#include "llvm/IR/ValueHandle.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"
|
||||
|
||||
using namespace llvm;
|
||||
@ -451,3 +454,46 @@ ReductionDescriptor::createMinMaxOp(IRBuilder<> &Builder,
|
||||
Value *Select = Builder.CreateSelect(Cmp, Left, Right, "rdx.minmax.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;
|
||||
}
|
||||
|
||||
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::isInductionVariable(PHINode *Phi,
|
||||
ConstantInt *&StepValue) {
|
||||
|
Loading…
Reference in New Issue
Block a user