[LoopVer] Optionally allow using memchecks from LAA
authorAdam Nemet <anemet@apple.com>
Wed, 12 Aug 2015 16:51:19 +0000 (16:51 +0000)
committerAdam Nemet <anemet@apple.com>
Wed, 12 Aug 2015 16:51:19 +0000 (16:51 +0000)
r243382 changed the behavior to always require a set of memchecks to be
passed to LoopVer.  This change restores the prior behavior as an
alternative to the new behavior.  This allows the checks to be
implicitly taken from the LAA object.

Patch by Ashutosh Nema!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@244763 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/LoopAccessAnalysis.h
include/llvm/Transforms/Utils/LoopVersioning.h
lib/Transforms/Utils/LoopVersioning.cpp

index 25da9827eea260cbc88069db1fea6b047244cdee..c4a9dc42cc8f1ce783c3dd993c76bd1b5e849c65 100644 (file)
@@ -384,7 +384,7 @@ public:
                       bool UseDependencies);
 
   /// \brief Returns the checks that generateChecks created.
-  const SmallVectorImpl<PointerCheck> &getChecks() const { return Checks; }
+  const SmallVector<PointerCheck, 4> &getChecks() const { return Checks; }
 
   /// \brief Decide if we need to add a check between two groups of pointers,
   /// according to needsChecking.
index d4932fc5946272faf53b013683a80408fa3fc265..4779b7ede2b4fdcbbd63a4e111ab8b66dc11c8d0 100644 (file)
@@ -31,10 +31,17 @@ class LoopInfo;
 /// already has a preheader.
 class LoopVersioning {
 public:
+  /// \brief Expects MemCheck, LoopAccessInfo, Loop, LoopInfo, DominatorTree
+  /// as input. It uses runtime check provided by user.
   LoopVersioning(SmallVector<RuntimePointerChecking::PointerCheck, 4> Checks,
                  const LoopAccessInfo &LAI, Loop *L, LoopInfo *LI,
                  DominatorTree *DT);
 
+  /// \brief Expects LoopAccessInfo, Loop, LoopInfo, DominatorTree as input.
+  /// It uses default runtime check provided by LoopAccessInfo.
+  LoopVersioning(const LoopAccessInfo &LAInfo, Loop *L, LoopInfo *LI,
+                 DominatorTree *DT);
+
   /// \brief Performs the CFG manipulation part of versioning the loop including
   /// the DominatorTree and LoopInfo updates.
   ///
index 4d2b1ee101fcd487d3396d84858b6fafc97486fd..ad2de241b4087dfe0d14ffc48d05444d92461e7b 100644 (file)
@@ -31,6 +31,15 @@ LoopVersioning::LoopVersioning(
   assert(L->getLoopPreheader() && "No preheader");
 }
 
+LoopVersioning::LoopVersioning(const LoopAccessInfo &LAInfo, Loop *L,
+                               LoopInfo *LI, DominatorTree *DT)
+    : VersionedLoop(L), NonVersionedLoop(nullptr),
+      Checks(LAInfo.getRuntimePointerChecking()->getChecks()), LAI(LAInfo),
+      LI(LI), DT(DT) {
+  assert(L->getExitBlock() && "No single exit block");
+  assert(L->getLoopPreheader() && "No preheader");
+}
+
 void LoopVersioning::versionLoop(Pass *P) {
   Instruction *FirstCheckInst;
   Instruction *MemRuntimeCheck;