[llvm-commits] [parallel] CVS: llvm/lib/Analysis/ParallelInfo.cpp

Misha Brukman brukman at cs.uiuc.edu
Thu May 6 11:32:04 PDT 2004


Changes in directory llvm/lib/Analysis:

ParallelInfo.cpp updated: 1.1.2.2 -> 1.1.2.3

---
Log message:

Pbr and join no longer need a static 1-to-1 mapping; we only require a 1-to-1
dynamic execution.


---
Diffs of the changes:  (+45 -35)

Index: llvm/lib/Analysis/ParallelInfo.cpp
diff -u llvm/lib/Analysis/ParallelInfo.cpp:1.1.2.2 llvm/lib/Analysis/ParallelInfo.cpp:1.1.2.3
--- llvm/lib/Analysis/ParallelInfo.cpp:1.1.2.2	Fri Apr 16 11:36:01 2004
+++ llvm/lib/Analysis/ParallelInfo.cpp	Thu May  6 11:31:53 2004
@@ -14,6 +14,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/iOther.h"
+#include "llvm/iPHINode.h"
 #include "llvm/iTerminators.h"
 #include "llvm/Analysis/Dominators.h"
 #include "llvm/Analysis/ParallelInfo.h"
@@ -34,13 +35,15 @@
 //
 
 ParallelRegion::~ParallelRegion() {
-  for (std::vector<ParallelSeq*>::iterator i = children.begin(),
-         e = children.end(); i != e; ++i)
+  for (std::vector<ParallelSeq*>::iterator i = Children.begin(),
+         e = Children.end(); i != e; ++i)
     (*i)->setParent(0);
+
+  // recursively destroy contained parallel sequences?
 }
 
 void ParallelRegion::addChildSeq(ParallelSeq *PS) { 
-  children.push_back(PS); 
+  Children.push_back(PS); 
   PS->setParent(this);
 }
 
@@ -56,14 +59,25 @@
 }
 
 void ParallelRegion::print(std::ostream &os) {
-  for (const_iterator i = const_begin(), e = const_end(); i != e; ++i) {
+  for (const_iterator i = const_begin(), e = const_end(); i != e; ++i)
     os << (*i)->getName() << " ";
-  }
+}
+
+static bool findPbr(Value *V, ParaBrInst *pbr) {
+  if (V == pbr)
+    return true;
+  else if (PHINode *phi = dyn_cast<PHINode>(V)) {
+    bool Found = false;
+    for (unsigned i = 0, e = phi->getNumIncomingValues(); i != e; ++i)
+      if (findPbr(phi->getIncomingValue(i), pbr))
+        return true;
+    return false;
+  } else
+    return false;
 }
 
 ParallelRegion* ParallelRegion::discoverRegion(BasicBlock *pbrBlock,
-                                               BasicBlock *begin,
-                                               BasicBlock *end) {
+                                               BasicBlock *begin) {
   ParallelRegion *PR = new ParallelRegion();
   
   // accumulate all the basic blocks in the subtree following to the first
@@ -72,20 +86,33 @@
   std::vector<BasicBlock*> Worklist;
   DEBUG(std::cerr << "begin: " << begin->getName() << "\n");
   Worklist.push_back(begin);
+  ParaBrInst *pbr = dyn_cast<ParaBrInst>(pbrBlock->getTerminator());
 
   while (!Worklist.empty()) {
     BasicBlock *BB = Worklist.back();
     DEBUG(std::cerr << "processing: " << BB->getName() << "\n");
     Worklist.pop_back();
-    PR->addBasicBlock(BB);
 
+    // if this block contains a join to the pbr which we've begun from, then
+    // stop processing this block
+    bool done = false;
+    for (BasicBlock::iterator i = BB->begin(), e = BB->end(); i != e; ++i)
+      if (CallInst *CI = dyn_cast<CallInst>(i))
+        if (CI->getCalledFunction()->getName() == "llvm.join" &&
+            findPbr(CI->getOperand(1), pbr)) {
+          done = true;
+          break;
+        }
+    if (done) continue;
+
+    PR->addBasicBlock(BB);
     TerminatorInst *TI = BB->getTerminator();
     // Add all successors to the worklist
     if (BranchInst *BI = dyn_cast<BranchInst>(TI)) {
       for (unsigned i = 0, e = BI->getNumSuccessors(); i != e; ++i) {
         BasicBlock *succ = BI->getSuccessor(i);
         DEBUG(std::cerr << "successor: " << succ->getName() << "\n");
-        if (succ != pbrBlock && succ != end && !PR->contains(succ) &&
+        if (succ != pbrBlock && !PR->contains(succ) &&
             std::find(Worklist.begin(), Worklist.end(), succ) == Worklist.end())
           Worklist.push_back(succ);
       }
@@ -93,23 +120,17 @@
       for (unsigned i = 0, e = SI->getNumCases(); i != e; ++i) {
         BasicBlock *succ = SI->getSuccessor(i);
         DEBUG(std::cerr << "successor: " << succ->getName() << "\n");
-        if (succ != pbrBlock && succ != end && !PR->contains(succ) &&
+        if (succ != pbrBlock && !PR->contains(succ) &&
             std::find(Worklist.begin(), Worklist.end(), succ) == Worklist.end())
           Worklist.push_back(succ);
       }
     } else if (ReturnInst *RI = dyn_cast<ReturnInst>(TI)) {
       assert(0 && "return not handled within parallel region");
     } else if (ParaBrInst *PB = dyn_cast<ParaBrInst>(TI)) {
-      Value::use_iterator pbrUser = PB->use_begin();
-      assert(pbrUser != PB->use_end() && "pbr not closed by join()?");
-      CallInst *CI = dyn_cast<CallInst>(*pbrUser);
-      assert(CI && "result of pbr used in a non-call instr");
-      assert(CI->getCalledFunction()->getName() == "llvm.join" &&
-             "result of pbr used in a call to something besides `llvm.join'");
-      BasicBlock *pbrBB = PB->getParent(), *joinBB = CI->getParent();
+      BasicBlock *pbrBB = PB->getParent();
       ParallelSeq *PS =  
-        new ParallelSeq(discoverRegion(pbrBB, PB->getSuccessor(0), joinBB),
-                        discoverRegion(pbrBB, PB->getSuccessor(1), joinBB),
+        new ParallelSeq(discoverRegion(pbrBB, PB->getSuccessor(0)),
+                        discoverRegion(pbrBB, PB->getSuccessor(1)),
                         pbrBB);
       PR->addChildSeq(PS);
     } else {
@@ -128,7 +149,7 @@
 /// contains - Return true of the specified basic block is in this loop
 ///
 bool ParallelSeq::contains(const BasicBlock *BB) const {
-  for (region_iterator i = region_begin(), e = region_end(); i != e; ++i)
+  for (const_riterator i = const_rbegin(), e = const_rend(); i != e; ++i)
     if ((*i)->contains(BB))
       return true;
   return false;
@@ -138,9 +159,8 @@
   unsigned region = 0;
   if (SeqHeader)
     os << "header: " << SeqHeader->getName() << "\n";
-  for (region_iterator i = region_begin(), e = region_end(); i != e;
-       ++i, ++region)
-  {
+  for (const_riterator i = const_rbegin(), e = const_rend(); i != e;
+       ++i, ++region) {
     os << utostr(region) << " ";
     (*i)->print(os);
     os << "\n";
@@ -177,21 +197,11 @@
 
   // process each successor tree separately into regions, and combine them
   // into a parallel sequence
-
-  // The last instruction of the pbr BasicBlock is the pbr that spawned the
-  // regionStart, so find the join instruction correlated to it and hence the
-  // end basic block for the region.
-  Value::use_iterator join = PBr->use_begin();
-  CallInst *call = dyn_cast<CallInst>(*join);
-  // FIXME: make sure the call is to "llvm.join" intrinsic
-  assert(call && "Value returned by pbr used in something not a call to join!");
-  BasicBlock *end = call->getParent();
-
   ParallelRegion *PR0 =
-    ParallelRegion::discoverRegion(PBr->getParent(), PBr->getSuccessor(0), end);
+    ParallelRegion::discoverRegion(PBr->getParent(), PBr->getSuccessor(0));
   DEBUG(std::cerr << "PR0: "; PR0->print(std::cerr); std::cerr << "\n";);
   ParallelRegion *PR1 =
-    ParallelRegion::discoverRegion(PBr->getParent(), PBr->getSuccessor(1), end);
+    ParallelRegion::discoverRegion(PBr->getParent(), PBr->getSuccessor(1));
   DEBUG(std::cerr << "PR1: "; PR1->print(std::cerr); std::cerr << "\n";);
 
   // construct a parallel sequence





More information about the llvm-commits mailing list