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:
Sebastian Pop 2014-05-09 22:45:07 +00:00
parent 444621abe1
commit 47fe7de1b5
4 changed files with 15 additions and 16 deletions

View File

@ -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;

View File

@ -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,

View File

@ -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;

View File

@ -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);