[ScopDetect/Info] Allow unconditional hoisting of loads from dereferenceable ptrs
In case LLVM pointers are annotated with !dereferencable attributes/metadata
or LLVM can look at the allocation from which a pointer is derived, we can know
that dereferencing pointers is safe and can be done unconditionally. We use this
information to proof certain pointers as save to hoist and then hoist them
unconditionally.
llvm-svn: 297375
diff --git a/polly/lib/Analysis/ScopDetection.cpp b/polly/lib/Analysis/ScopDetection.cpp
index 909c114..44b1782 100644
--- a/polly/lib/Analysis/ScopDetection.cpp
+++ b/polly/lib/Analysis/ScopDetection.cpp
@@ -53,6 +53,7 @@
#include "polly/Support/ScopLocation.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/AliasAnalysis.h"
+#include "llvm/Analysis/Loads.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Analysis/RegionIterator.h"
#include "llvm/Analysis/ScalarEvolution.h"
@@ -343,6 +344,8 @@
bool ScopDetection::onlyValidRequiredInvariantLoads(
InvariantLoadsSetTy &RequiredILS, DetectionContext &Context) const {
Region &CurRegion = Context.CurRegion;
+ const DataLayout &DL =
+ CurRegion.getEntry()->getParent()->getParent()->getDataLayout();
if (!PollyInvariantLoadHoisting && !RequiredILS.empty())
return false;
@@ -351,10 +354,16 @@
if (!isHoistableLoad(Load, CurRegion, *LI, *SE, *DT))
return false;
- for (auto NonAffineRegion : Context.NonAffineSubRegionSet)
+ for (auto NonAffineRegion : Context.NonAffineSubRegionSet) {
+
+ if (isSafeToLoadUnconditionally(Load->getPointerOperand(),
+ Load->getAlignment(), DL))
+ continue;
+
if (NonAffineRegion->contains(Load) &&
Load->getParent() != NonAffineRegion->getEntry())
return false;
+ }
}
Context.RequiredILS.insert(RequiredILS.begin(), RequiredILS.end());