[polly] r217508 - [Refactor] Cleanup isl code generation

Johannes Doerfert doerfert at cs.uni-saarland.de
Mon Sep 15 03:10:43 PDT 2014


On 09/15, Tobias Grosser wrote:
> On 15/09/2014 11:32, Johannes Doerfert wrote:
> >On 09/15, Tobias Grosser wrote:
> >>>On 14/09/2014 18:45, Johannes Doerfert wrote:
> >>>> >Attached a fix for the problem. Could you take a look?
> >>>
> >>>Thanks.
> >>>
> >>>> > From ee01feec4f9b7616f4a37fad7c71bd4f4d471d6e Mon Sep 17 00:00:00 2001
> >>>> >From: Johannes Doerfert<doerfert at cs.uni-saarland.de>
> >>>> >Date: Sun, 14 Sep 2014 18:41:57 +0200
> >>>> >Subject: [PATCH] [Fix] Rewire the Region after a unconditional entry edge is
> >>>> >  created
> >>>> >
> >>>> >   We use SplitEdge to split a conditional entry edge of the SCoP region.
> >>>> >   However, SplitEdge can cause two different situations. This patch tests
> >>>> >   which one is present and deals with the former unhandled one.
> >>>
> >>>It would be interesting to mention the actual issue in the commit message.
> >I thought I did. The second, before not-handled way, SplitEdge can "split
> >an edge".
> >
> >>>At a first look I thought we missed the update of the ScopStmt, but now
> >>>looking again it seems as if we missed the simple case and incorrectly
> >>>updated the ScoP. Is this right?
> >No. Only the simple case was covered, thus the one were the SCoP doesn't
> >need to be updated. Now both situations are implemented, the simple one
> >(then branch) and the complicated one where we update the SCoP. I just
> >moved this update mechanism into an own function as it is used twice now.
> 
> OK. Then I misunderstood. Now I really believe the patch makes sense. :-)
> 
> One more comment inline:
> 
> >>>Also, it would be good to have a test case that reproduces the problem.
> >Yes, I will try to create one.
> >
> >>>Cheers,
> >>>Tobias
> >>>
> >>>
> >>>> >  lib/Support/ScopHelper.cpp | 52 ++++++++++++++++++++++++++++++++++++++--------
> >>>> >  1 file changed, 43 insertions(+), 9 deletions(-)
> >>>> >
> >>>> >diff --git a/lib/Support/ScopHelper.cpp b/lib/Support/ScopHelper.cpp
> >>>> >index 01c1dd0..0e2f6fa 100644
> >>>> >--- a/lib/Support/ScopHelper.cpp
> >>>> >+++ b/lib/Support/ScopHelper.cpp
> >>>> >@@ -86,6 +86,17 @@ BasicBlock *polly::createSingleExitEdge(Region *R, Pass *P) {
> >>>> >    return SplitBlockPredecessors(BB, Preds, ".region", P);
> >>>> >  }
> >>>> >
> >>>> >+static void replaceScopAndRegionEntry(polly::Scop *S, BasicBlock *OldEntry,
> >>>> >+                                      BasicBlock *NewEntry) {
> >>>> >+  for (polly::ScopStmt *Stmt : *S)
> >>>> >+    if (Stmt->getBasicBlock() == OldEntry) {
> >>>> >+      Stmt->setBasicBlock(NewEntry);
> >>>> >+      break;
> >>>> >+    }
> >>>> >+
> >>>> >+  S->getRegion().replaceEntryRecursive(NewEntry);
> >>>> >+}
> >>>> >+
> >>>> >  BasicBlock *polly::simplifyRegion(Scop *S, Pass *P) {
> >>>> >    Region *R = &S->getRegion();
> >>>> >
> >>>> >@@ -96,20 +107,43 @@ BasicBlock *polly::simplifyRegion(Scop *S, Pass *P) {
> >>>> >    if (!EnteringBB) {
> >>>> >      BasicBlock *OldEntry = R->getEntry();
> >>>> >      BasicBlock *NewEntry = SplitBlock(OldEntry, OldEntry->begin(), P);
> >>>> >-
> >>>> >-    for (ScopStmt *Stmt : *S)
> >>>> >-      if (Stmt->getBasicBlock() == OldEntry) {
> >>>> >-        Stmt->setBasicBlock(NewEntry);
> >>>> >-        break;
> >>>> >-      }
> >>>> >-
> >>>> >-    R->replaceEntryRecursive(NewEntry);
> >>>> >+    replaceScopAndRegionEntry(S, OldEntry, NewEntry);
> 
> You update it here once.
> 
> >>>> >      EnteringBB = OldEntry;
> >>>> >    }
> >>>> >
> >>>> >    // Create an unconditional entry edge.
> >>>> >    if (EnteringBB->getTerminator()->getNumSuccessors() != 1) {
> >>>> >-    EnteringBB = SplitEdge(EnteringBB, R->getEntry(), P);
> >>>> >+    BasicBlock *EntryBB = R->getEntry();
> >>>> >+    BasicBlock *SplitEdgeBB = SplitEdge(EnteringBB, EntryBB, P);
> >>>> >+
> >>>> >+    // Once the edge between EnteringBB and EntryBB is split, two cases arise.
> >>>> >+    // The first is simple. The new block is inserted between EnteringBB and
> >>>> >+    // EntryBB. In this case no further action is needed. However it might
> >>>> >+    // happen that the new block is inserted __after__ EntryBB causing the
> >>>> >+    // following situation:
> >>>> >+    //
> >>>> >+    // EnteringBB
> >>>> >+    //     |
> >>>> >+    //    / \
> >>>> >+    //    |  \-> some_other_BB_not_in_R
> >>>> >+    //    V
> >>>> >+    // EntryBB
> >>>> >+    //    |
> >>>> >+    //    V
> >>>> >+    // SplitEdgeBB
> >>>> >+    //
> >>>> >+    // In this case we need to swap the role of EntryBB and SplitEdgeBB.
> >>>> >+
> >>>> >+    // Check which case SplitEdge produced:
> >>>> >+    if (SplitEdgeBB->getTerminator()->getSuccessor(0) == EntryBB) {
> >>>> >+      // First (simple) case.
> >>>> >+      EnteringBB = SplitEdgeBB;
> >>>> >+    } else {
> >>>> >+      // Second (complicated) case.
> >>>> >+      replaceScopAndRegionEntry(S, EntryBB, SplitEdgeBB);
> 
> And here a second time.
> 
> >>>> >+      EnteringBB = EntryBB;
> >>>> >+    }
> 
> Would it make sense to to just update it _here_ a single time to the final
> value?
>
> If this is possible and actually simplifies the code, please change it.
I'll look into it and commit one way later today.

> Otherwise, LGTM.
> 
> Tobias

-- 

Johannes Doerfert
Researcher / PhD Student

Compiler Design Lab (Prof. Hack)
Saarland University, Computer Science
Building E1.3, Room 4.26

Tel. +49 (0)681 302-57521 : doerfert at cs.uni-saarland.de
Fax. +49 (0)681 302-3065  : http://www.cdl.uni-saarland.de/people/doerfert
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 213 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140915/6e70fdc2/attachment.sig>


More information about the llvm-commits mailing list