From c16ab9dd886920bf56bd51cbcf7218a7186e99dd Mon Sep 17 00:00:00 2001 From: Michael Kruse Date: Fri, 31 May 2019 19:40:20 +0000 Subject: [PATCH] [ScopBuilder] Move verifyInvariantLoads function from ScopInfo. NFC. Refactor Scop and ScopBuilder class. Move verifyInvariantLoads from Scop class to ScopBuilder class. Patch by: Dominik Adamski Differential Revision: https://reviews.llvm.org/D62628 llvm-svn: 362258 --- polly/include/polly/ScopBuilder.h | 15 +++++++++++++++ polly/include/polly/ScopInfo.h | 15 --------------- polly/lib/Analysis/ScopBuilder.cpp | 16 +++++++++++++++- polly/lib/Analysis/ScopInfo.cpp | 14 -------------- 4 files changed, 30 insertions(+), 30 deletions(-) diff --git a/polly/include/polly/ScopBuilder.h b/polly/include/polly/ScopBuilder.h index cd17bea..f24a46a 100644 --- a/polly/include/polly/ScopBuilder.h +++ b/polly/include/polly/ScopBuilder.h @@ -360,6 +360,21 @@ class ScopBuilder { /// potential reduction. void checkForReductions(ScopStmt &Stmt); + /// Verify that all required invariant loads have been hoisted. + /// + /// Invariant load hoisting is not guaranteed to hoist all loads that were + /// assumed to be scop invariant during scop detection. This function checks + /// for cases where the hoisting failed, but where it would have been + /// necessary for our scop modeling to be correct. In case of insufficient + /// hoisting the scop is marked as invalid. + /// + /// In the example below Bound[1] is required to be invariant: + /// + /// for (int i = 1; i < Bound[0]; i++) + /// for (int j = 1; j < Bound[1]; j++) + /// ... + void verifyInvariantLoads(); + /// Collect loads which might form a reduction chain with @p StoreMA. /// /// Check if the stored value for @p StoreMA is a binary operator with one or diff --git a/polly/include/polly/ScopInfo.h b/polly/include/polly/ScopInfo.h index bae105b..05d4d9c 100644 --- a/polly/include/polly/ScopInfo.h +++ b/polly/include/polly/ScopInfo.h @@ -2040,21 +2040,6 @@ private: /// nullptr if it cannot be hoisted at all. isl::set getNonHoistableCtx(MemoryAccess *Access, isl::union_map Writes); - /// Verify that all required invariant loads have been hoisted. - /// - /// Invariant load hoisting is not guaranteed to hoist all loads that were - /// assumed to be scop invariant during scop detection. This function checks - /// for cases where the hoisting failed, but where it would have been - /// necessary for our scop modeling to be correct. In case of insufficient - /// hoisting the scop is marked as invalid. - /// - /// In the example below Bound[1] is required to be invariant: - /// - /// for (int i = 1; i < Bound[0]; i++) - /// for (int j = 1; j < Bound[1]; j++) - /// ... - void verifyInvariantLoads(); - /// Hoist invariant memory loads and check for required ones. /// /// We first identify "common" invariant loads, thus loads that are invariant diff --git a/polly/lib/Analysis/ScopBuilder.cpp b/polly/lib/Analysis/ScopBuilder.cpp index b1de18f..51c9472 100644 --- a/polly/lib/Analysis/ScopBuilder.cpp +++ b/polly/lib/Analysis/ScopBuilder.cpp @@ -1306,6 +1306,20 @@ void ScopBuilder::checkForReductions(ScopStmt &Stmt) { } } +void ScopBuilder::verifyInvariantLoads() { + auto &RIL = scop->getRequiredInvariantLoads(); + for (LoadInst *LI : RIL) { + assert(LI && scop->contains(LI)); + // If there exists a statement in the scop which has a memory access for + // @p LI, then mark this scop as infeasible for optimization. + for (ScopStmt &Stmt : *scop) + if (Stmt.getArrayAccessOrNULLFor(LI)) { + scop->invalidate(INVARIANTLOAD, LI->getDebugLoc(), LI->getParent()); + return; + } + } +} + void ScopBuilder::collectCandidateReductionLoads( MemoryAccess *StoreMA, SmallVectorImpl &Loads) { ScopStmt *Stmt = StoreMA->getStatement(); @@ -1588,7 +1602,7 @@ void ScopBuilder::buildScop(Region &R, AssumptionCache &AC, scop->hoistInvariantLoads(); scop->canonicalizeDynamicBasePtrs(); - scop->verifyInvariantLoads(); + verifyInvariantLoads(); scop->simplifySCoP(true); // Check late for a feasible runtime context because profitability did not diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp index 24e26c5..f7712c3 100644 --- a/polly/lib/Analysis/ScopInfo.cpp +++ b/polly/lib/Analysis/ScopInfo.cpp @@ -3778,20 +3778,6 @@ isl::set Scop::getNonHoistableCtx(MemoryAccess *Access, isl::union_map Writes) { return WrittenCtx; } -void Scop::verifyInvariantLoads() { - auto &RIL = getRequiredInvariantLoads(); - for (LoadInst *LI : RIL) { - assert(LI && contains(LI)); - // If there exists a statement in the scop which has a memory access for - // @p LI, then mark this scop as infeasible for optimization. - for (ScopStmt &Stmt : Stmts) - if (Stmt.getArrayAccessOrNULLFor(LI)) { - invalidate(INVARIANTLOAD, LI->getDebugLoc(), LI->getParent()); - return; - } - } -} - void Scop::hoistInvariantLoads() { if (!PollyInvariantLoadHoisting) return; -- 2.7.4