diff options
-rw-r--r-- | llvm/include/llvm/Analysis/ScalarEvolution.h | 3 | ||||
-rw-r--r-- | llvm/lib/Analysis/LoopAccessAnalysis.cpp | 5 | ||||
-rw-r--r-- | llvm/lib/Analysis/ScalarEvolution.cpp | 23 | ||||
-rw-r--r-- | llvm/test/Analysis/LoopAccessAnalysis/wrapping-pointer-versioning.ll | 21 |
4 files changed, 52 insertions, 0 deletions
diff --git a/llvm/include/llvm/Analysis/ScalarEvolution.h b/llvm/include/llvm/Analysis/ScalarEvolution.h index 974a96e7a80..052a704f183 100644 --- a/llvm/include/llvm/Analysis/ScalarEvolution.h +++ b/llvm/include/llvm/Analysis/ScalarEvolution.h @@ -1691,6 +1691,9 @@ namespace llvm { ScalarEvolution *getSE() const { return &SE; } /// We need to explicitly define the copy constructor because of FlagsMap. PredicatedScalarEvolution(const PredicatedScalarEvolution&); + /// Print the SCEV mappings done by the Predicated Scalar Evolution. + /// The printed text is indented by \p Depth. + void print(raw_ostream &OS, unsigned Depth) const; private: /// \brief Increments the version number of the predicate. /// This needs to be called every time the SCEV predicate changes. diff --git a/llvm/lib/Analysis/LoopAccessAnalysis.cpp b/llvm/lib/Analysis/LoopAccessAnalysis.cpp index d1eac460ca3..222005f6f00 100644 --- a/llvm/lib/Analysis/LoopAccessAnalysis.cpp +++ b/llvm/lib/Analysis/LoopAccessAnalysis.cpp @@ -1904,6 +1904,11 @@ void LoopAccessInfo::print(raw_ostream &OS, unsigned Depth) const { OS.indent(Depth) << "SCEV assumptions:\n"; PSE.getUnionPredicate().print(OS, Depth); + + OS << "\n"; + + OS.indent(Depth) << "Expressions re-written:\n"; + PSE.print(OS, Depth); } const LoopAccessInfo & diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index 835668a5fc4..a05c2b9bd65 100644 --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -10364,3 +10364,26 @@ PredicatedScalarEvolution::PredicatedScalarEvolution( for (auto I = Init.FlagsMap.begin(), E = Init.FlagsMap.end(); I != E; ++I) FlagsMap.insert(*I); } + +void PredicatedScalarEvolution::print(raw_ostream &OS, unsigned Depth) const { + // For each block. + for (auto *BB : L.getBlocks()) + for (auto &I : *BB) { + if (!SE.isSCEVable(I.getType())) + continue; + + auto *Expr = SE.getSCEV(&I); + auto II = RewriteMap.find(Expr); + + if (II == RewriteMap.end()) + continue; + + // Don't print things that are not interesting. + if (II->second.second == Expr) + continue; + + OS.indent(Depth) << "[PSE]" << I << ":\n"; + OS.indent(Depth + 2) << *Expr << "\n"; + OS.indent(Depth + 2) << "--> " << *II->second.second << "\n"; + } +} diff --git a/llvm/test/Analysis/LoopAccessAnalysis/wrapping-pointer-versioning.ll b/llvm/test/Analysis/LoopAccessAnalysis/wrapping-pointer-versioning.ll index 038a0e3c4d2..ee9078c6607 100644 --- a/llvm/test/Analysis/LoopAccessAnalysis/wrapping-pointer-versioning.ll +++ b/llvm/test/Analysis/LoopAccessAnalysis/wrapping-pointer-versioning.ll @@ -31,6 +31,11 @@ target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" ; We have added the nusw flag to turn this expression into the SCEV expression: ; i64 {0,+,2}<%for.body> +; LAA: [PSE] %arrayidxA = getelementptr i16, i16* %a, i64 %mul_ext: +; LAA-NEXT: ((2 * (zext i32 {0,+,2}<%for.body> to i64)) + %a) +; LAA-NEXT: --> {%a,+,4}<%for.body> + + ; LV-LABEL: f1 ; LV-LABEL: for.body.lver.check ; LV: [[PredCheck0:%[^ ]*]] = icmp ne i128 @@ -100,6 +105,10 @@ for.end: ; preds = %for.body ; We have added the nusw flag to turn this expression into the following SCEV: ; i64 {zext i32 (2 * (trunc i64 %N to i32)) to i64,+,-2}<%for.body> +; LAA: [PSE] %arrayidxA = getelementptr i16, i16* %a, i64 %mul_ext: +; LAA-NEXT: ((2 * (zext i32 {(2 * (trunc i64 %N to i32)),+,-2}<%for.body> to i64)) + %a) +; LAA-NEXT: --> {((2 * (zext i32 (2 * (trunc i64 %N to i32)) to i64)) + %a),+,-4}<%for.body> + ; LV-LABEL: f2 ; LV-LABEL: for.body.lver.check ; LV: [[PredCheck0:%[^ ]*]] = icmp ne i128 @@ -154,6 +163,10 @@ for.end: ; preds = %for.body ; We have added the nssw flag to turn this expression into the following SCEV: ; i64 {0,+,2}<%for.body> +; LAA: [PSE] %arrayidxA = getelementptr i16, i16* %a, i64 %mul_ext: +; LAA-NEXT: ((2 * (sext i32 {0,+,2}<%for.body> to i64)) + %a) +; LAA-NEXT: --> {%a,+,4}<%for.body> + ; LV-LABEL: f3 ; LV-LABEL: for.body.lver.check ; LV: [[PredCheck0:%[^ ]*]] = icmp ne i128 @@ -204,6 +217,10 @@ for.end: ; preds = %for.body ; We have added the nssw flag to turn this expression into the following SCEV: ; i64 {sext i32 (2 * (trunc i64 %N to i32)) to i64,+,-2}<%for.body> +; LAA: [PSE] %arrayidxA = getelementptr i16, i16* %a, i64 %mul_ext: +; LAA-NEXT: ((2 * (sext i32 {(2 * (trunc i64 %N to i32)),+,-2}<%for.body> to i64)) + %a) +; LAA-NEXT: --> {((2 * (sext i32 (2 * (trunc i64 %N to i32)) to i64)) + %a),+,-4}<%for.body> + ; LV-LABEL: f4 ; LV-LABEL: for.body.lver.check ; LV: [[PredCheck0:%[^ ]*]] = icmp ne i128 @@ -257,6 +274,10 @@ for.end: ; preds = %for.body ; LAA-NEXT: {(2 * (trunc i64 %N to i32)),+,-2}<%for.body> Added Flags: <nssw> ; LAA-NEXT: {((2 * (sext i32 (2 * (trunc i64 %N to i32)) to i64)) + %a),+,-4}<%for.body> Added Flags: <nusw> +; LAA: [PSE] %arrayidxA = getelementptr inbounds i16, i16* %a, i32 %mul: +; LAA-NEXT: ((2 * (sext i32 {(2 * (trunc i64 %N to i32)),+,-2}<%for.body> to i64))<nsw> + %a)<nsw> +; LAA-NEXT: --> {((2 * (sext i32 (2 * (trunc i64 %N to i32)) to i64)) + %a),+,-4}<%for.body> + ; LV-LABEL: f5 ; LV-LABEL: for.body.lver.check define void @f5(i16* noalias %a, |