summaryrefslogtreecommitdiffstats
path: root/polly/lib/Support/ScopHelper.cpp
diff options
context:
space:
mode:
authorMichael Kruse <llvm@meinersbur.de>2016-06-28 01:37:13 +0000
committerMichael Kruse <llvm@meinersbur.de>2016-06-28 01:37:13 +0000
commit6ff419c2ec8ac6f4718a46aebda94567c95045dd (patch)
tree95147ac7f4d77b77df591b15019a44a10e51d43f /polly/lib/Support/ScopHelper.cpp
parent728356d10a7333c154ca8cf980d714b988a7b44a (diff)
downloadbcm5719-llvm-6ff419c2ec8ac6f4718a46aebda94567c95045dd.tar.gz
bcm5719-llvm-6ff419c2ec8ac6f4718a46aebda94567c95045dd.zip
Move getIndexExpressionsFromGEP() to ScopHelper. NFC.
This function is used by both ScopInfo and ScopBuilder. A common location for this function is required when ScopInfo and ScopBuilder are separated into separate files in the next commit. llvm-svn: 273981
Diffstat (limited to 'polly/lib/Support/ScopHelper.cpp')
-rw-r--r--polly/lib/Support/ScopHelper.cpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/polly/lib/Support/ScopHelper.cpp b/polly/lib/Support/ScopHelper.cpp
index c97eedffcf1..9e94b9f5740 100644
--- a/polly/lib/Support/ScopHelper.cpp
+++ b/polly/lib/Support/ScopHelper.cpp
@@ -490,3 +490,52 @@ llvm::BasicBlock *polly::getUseBlock(llvm::Use &U) {
return UI->getParent();
}
+
+std::tuple<std::vector<const SCEV *>, std::vector<int>>
+polly::getIndexExpressionsFromGEP(GetElementPtrInst *GEP, ScalarEvolution &SE) {
+ std::vector<const SCEV *> Subscripts;
+ std::vector<int> Sizes;
+
+ Type *Ty = GEP->getPointerOperandType();
+
+ bool DroppedFirstDim = false;
+
+ for (unsigned i = 1; i < GEP->getNumOperands(); i++) {
+
+ const SCEV *Expr = SE.getSCEV(GEP->getOperand(i));
+
+ if (i == 1) {
+ if (auto *PtrTy = dyn_cast<PointerType>(Ty)) {
+ Ty = PtrTy->getElementType();
+ } else if (auto *ArrayTy = dyn_cast<ArrayType>(Ty)) {
+ Ty = ArrayTy->getElementType();
+ } else {
+ Subscripts.clear();
+ Sizes.clear();
+ break;
+ }
+ if (auto *Const = dyn_cast<SCEVConstant>(Expr))
+ if (Const->getValue()->isZero()) {
+ DroppedFirstDim = true;
+ continue;
+ }
+ Subscripts.push_back(Expr);
+ continue;
+ }
+
+ auto *ArrayTy = dyn_cast<ArrayType>(Ty);
+ if (!ArrayTy) {
+ Subscripts.clear();
+ Sizes.clear();
+ break;
+ }
+
+ Subscripts.push_back(Expr);
+ if (!(DroppedFirstDim && i == 2))
+ Sizes.push_back(ArrayTy->getNumElements());
+
+ Ty = ArrayTy->getElementType();
+ }
+
+ return std::make_tuple(Subscripts, Sizes);
+}
OpenPOWER on IntegriCloud