summaryrefslogtreecommitdiffstats
path: root/polly/lib
diff options
context:
space:
mode:
Diffstat (limited to 'polly/lib')
-rw-r--r--polly/lib/Analysis/ScopDetection.cpp20
-rw-r--r--polly/lib/Analysis/ScopInfo.cpp15
2 files changed, 27 insertions, 8 deletions
diff --git a/polly/lib/Analysis/ScopDetection.cpp b/polly/lib/Analysis/ScopDetection.cpp
index 2ceb3fa62dc..7810b94c4e5 100644
--- a/polly/lib/Analysis/ScopDetection.cpp
+++ b/polly/lib/Analysis/ScopDetection.cpp
@@ -533,17 +533,21 @@ bool ScopDetection::isValidIntrinsicInst(IntrinsicInst &II,
case llvm::Intrinsic::memmove:
case llvm::Intrinsic::memcpy:
AF = SE->getSCEVAtScope(cast<MemTransferInst>(II).getSource(), L);
- BP = dyn_cast<SCEVUnknown>(SE->getPointerBase(AF));
- // Bail if the source pointer is not valid.
- if (!isValidAccess(&II, AF, BP, Context))
- return false;
+ if (!AF->isZero()) {
+ BP = dyn_cast<SCEVUnknown>(SE->getPointerBase(AF));
+ // Bail if the source pointer is not valid.
+ if (!isValidAccess(&II, AF, BP, Context))
+ return false;
+ }
// Fall through
case llvm::Intrinsic::memset:
AF = SE->getSCEVAtScope(cast<MemIntrinsic>(II).getDest(), L);
- BP = dyn_cast<SCEVUnknown>(SE->getPointerBase(AF));
- // Bail if the destination pointer is not valid.
- if (!isValidAccess(&II, AF, BP, Context))
- return false;
+ if (!AF->isZero()) {
+ BP = dyn_cast<SCEVUnknown>(SE->getPointerBase(AF));
+ // Bail if the destination pointer is not valid.
+ if (!isValidAccess(&II, AF, BP, Context))
+ return false;
+ }
// Bail if the length is not affine.
if (!isAffine(SE->getSCEVAtScope(cast<MemIntrinsic>(II).getLength(), L), L,
diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp
index af56aac719b..471a6669f7a 100644
--- a/polly/lib/Analysis/ScopInfo.cpp
+++ b/polly/lib/Analysis/ScopInfo.cpp
@@ -3942,8 +3942,17 @@ bool ScopInfo::buildAccessMemIntrinsic(
auto *DestPtrVal = MemIntr->getDest();
assert(DestPtrVal);
+
auto *DestAccFunc = SE->getSCEVAtScope(DestPtrVal, L);
assert(DestAccFunc);
+ // Ignore accesses to "NULL".
+ // TODO: We could use this to optimize the region further, e.g., intersect
+ // the context with
+ // isl_set_complement(isl_set_params(getDomain()))
+ // as we know it would be undefined to execute this instruction anyway.
+ if (DestAccFunc->isZero())
+ return true;
+
auto *DestPtrSCEV = dyn_cast<SCEVUnknown>(SE->getPointerBase(DestAccFunc));
assert(DestPtrSCEV);
DestAccFunc = SE->getMinusSCEV(DestAccFunc, DestPtrSCEV);
@@ -3957,8 +3966,14 @@ bool ScopInfo::buildAccessMemIntrinsic(
auto *SrcPtrVal = MemTrans->getSource();
assert(SrcPtrVal);
+
auto *SrcAccFunc = SE->getSCEVAtScope(SrcPtrVal, L);
assert(SrcAccFunc);
+ // Ignore accesses to "NULL".
+ // TODO: See above TODO
+ if (SrcAccFunc->isZero())
+ return true;
+
auto *SrcPtrSCEV = dyn_cast<SCEVUnknown>(SE->getPointerBase(SrcAccFunc));
assert(SrcPtrSCEV);
SrcAccFunc = SE->getMinusSCEV(SrcAccFunc, SrcPtrSCEV);
OpenPOWER on IntegriCloud