forked from OSchip/llvm-project
move findArrayDimensions to ScalarEvolution
we do not use the information from SCEVAddRecExpr to compute the shape of the array, so a better place for this function is in ScalarEvolution. llvm-svn: 208456
This commit is contained in:
parent
444621abe1
commit
47fe7de1b5
|
@ -894,6 +894,11 @@ namespace llvm {
|
||||||
/// indirect operand.
|
/// indirect operand.
|
||||||
bool hasOperand(const SCEV *S, const SCEV *Op) const;
|
bool hasOperand(const SCEV *S, const SCEV *Op) const;
|
||||||
|
|
||||||
|
/// Compute the array dimensions Sizes from the set of Terms extracted from
|
||||||
|
/// the memory access function of this SCEVAddRecExpr.
|
||||||
|
void findArrayDimensions(SmallVectorImpl<const SCEV *> &Terms,
|
||||||
|
SmallVectorImpl<const SCEV *> &Sizes) const;
|
||||||
|
|
||||||
bool runOnFunction(Function &F) override;
|
bool runOnFunction(Function &F) override;
|
||||||
void releaseMemory() override;
|
void releaseMemory() override;
|
||||||
void getAnalysisUsage(AnalysisUsage &AU) const override;
|
void getAnalysisUsage(AnalysisUsage &AU) const override;
|
||||||
|
|
|
@ -361,12 +361,6 @@ namespace llvm {
|
||||||
void collectParametricTerms(ScalarEvolution &SE,
|
void collectParametricTerms(ScalarEvolution &SE,
|
||||||
SmallVectorImpl<const SCEV *> &Terms) const;
|
SmallVectorImpl<const SCEV *> &Terms) const;
|
||||||
|
|
||||||
/// Compute the array dimensions Sizes from the set of Terms extracted from
|
|
||||||
/// the memory access function of this SCEVAddRecExpr.
|
|
||||||
void findArrayDimensions(ScalarEvolution &SE,
|
|
||||||
SmallVectorImpl<const SCEV *> &Terms,
|
|
||||||
SmallVectorImpl<const SCEV *> &Sizes) const;
|
|
||||||
|
|
||||||
/// Return in Subscripts the access functions for each dimension in Sizes.
|
/// Return in Subscripts the access functions for each dimension in Sizes.
|
||||||
const SCEV *
|
const SCEV *
|
||||||
computeAccessFunctions(ScalarEvolution &SE,
|
computeAccessFunctions(ScalarEvolution &SE,
|
||||||
|
|
|
@ -3195,7 +3195,7 @@ DependenceAnalysis::tryDelinearize(const SCEV *SrcSCEV, const SCEV *DstSCEV,
|
||||||
|
|
||||||
// Second step: find subscript sizes.
|
// Second step: find subscript sizes.
|
||||||
SmallVector<const SCEV *, 4> Sizes;
|
SmallVector<const SCEV *, 4> Sizes;
|
||||||
SrcAR->findArrayDimensions(*SE, Terms, Sizes);
|
SE->findArrayDimensions(Terms, Sizes);
|
||||||
|
|
||||||
// Third step: compute the access functions for each subscript.
|
// Third step: compute the access functions for each subscript.
|
||||||
SmallVector<const SCEV *, 4> SrcSubscripts, DstSubscripts;
|
SmallVector<const SCEV *, 4> SrcSubscripts, DstSubscripts;
|
||||||
|
|
|
@ -7195,8 +7195,7 @@ findGCD(ScalarEvolution &SE, SmallVectorImpl<const SCEV *> &Terms) {
|
||||||
|
|
||||||
static void findArrayDimensionsRec(ScalarEvolution &SE,
|
static void findArrayDimensionsRec(ScalarEvolution &SE,
|
||||||
SmallVectorImpl<const SCEV *> &Terms,
|
SmallVectorImpl<const SCEV *> &Terms,
|
||||||
SmallVectorImpl<const SCEV *> &Sizes,
|
SmallVectorImpl<const SCEV *> &Sizes) {
|
||||||
const SCEV *Zero, const SCEV *One) {
|
|
||||||
// The GCD of all Terms is the dimension of the innermost dimension.
|
// The GCD of all Terms is the dimension of the innermost dimension.
|
||||||
const SCEV *GCD = findGCD(SE, Terms);
|
const SCEV *GCD = findGCD(SE, Terms);
|
||||||
|
|
||||||
|
@ -7215,6 +7214,8 @@ static void findArrayDimensionsRec(ScalarEvolution &SE,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const SCEV *Zero = SE.getConstant(GCD->getType(), 0);
|
||||||
|
|
||||||
for (unsigned I = 0; I < Terms.size(); ++I) {
|
for (unsigned I = 0; I < Terms.size(); ++I) {
|
||||||
// Normalize the terms before the next call to findArrayDimensionsRec.
|
// Normalize the terms before the next call to findArrayDimensionsRec.
|
||||||
const SCEV *Q, *R;
|
const SCEV *Q, *R;
|
||||||
|
@ -7230,7 +7231,7 @@ static void findArrayDimensionsRec(ScalarEvolution &SE,
|
||||||
Terms.end());
|
Terms.end());
|
||||||
|
|
||||||
if (Terms.size() > 0)
|
if (Terms.size() > 0)
|
||||||
findArrayDimensionsRec(SE, Terms, Sizes, Zero, One);
|
findArrayDimensionsRec(SE, Terms, Sizes);
|
||||||
Sizes.push_back(GCD);
|
Sizes.push_back(GCD);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7283,8 +7284,8 @@ static inline int numberOfTerms(const SCEV *S) {
|
||||||
|
|
||||||
/// Second step of delinearization: compute the array dimensions Sizes from the
|
/// Second step of delinearization: compute the array dimensions Sizes from the
|
||||||
/// set of Terms extracted from the memory access function of this SCEVAddRec.
|
/// set of Terms extracted from the memory access function of this SCEVAddRec.
|
||||||
void SCEVAddRecExpr::findArrayDimensions(
|
void ScalarEvolution::findArrayDimensions(
|
||||||
ScalarEvolution &SE, SmallVectorImpl<const SCEV *> &Terms,
|
SmallVectorImpl<const SCEV *> &Terms,
|
||||||
SmallVectorImpl<const SCEV *> &Sizes) const {
|
SmallVectorImpl<const SCEV *> &Sizes) const {
|
||||||
|
|
||||||
if (Terms.size() < 2)
|
if (Terms.size() < 2)
|
||||||
|
@ -7316,9 +7317,8 @@ void SCEVAddRecExpr::findArrayDimensions(
|
||||||
dbgs() << *T << "\n";
|
dbgs() << *T << "\n";
|
||||||
});
|
});
|
||||||
|
|
||||||
const SCEV *Zero = SE.getConstant(this->getType(), 0);
|
ScalarEvolution &SE = *const_cast<ScalarEvolution *>(this);
|
||||||
const SCEV *One = SE.getConstant(this->getType(), 1);
|
findArrayDimensionsRec(SE, Terms, Sizes);
|
||||||
findArrayDimensionsRec(SE, Terms, Sizes, Zero, One);
|
|
||||||
|
|
||||||
DEBUG({
|
DEBUG({
|
||||||
dbgs() << "Sizes:\n";
|
dbgs() << "Sizes:\n";
|
||||||
|
@ -7436,7 +7436,7 @@ SCEVAddRecExpr::delinearize(ScalarEvolution &SE,
|
||||||
collectParametricTerms(SE, Terms);
|
collectParametricTerms(SE, Terms);
|
||||||
|
|
||||||
// Second step: find subscript sizes.
|
// Second step: find subscript sizes.
|
||||||
findArrayDimensions(SE, Terms, Sizes);
|
SE.findArrayDimensions(Terms, Sizes);
|
||||||
|
|
||||||
// Third step: compute the access functions for each subscript.
|
// Third step: compute the access functions for each subscript.
|
||||||
const SCEV *Remainder = computeAccessFunctions(SE, Subscripts, Sizes);
|
const SCEV *Remainder = computeAccessFunctions(SE, Subscripts, Sizes);
|
||||||
|
|
Loading…
Reference in New Issue