Pull out this predicate loop into a helper function.
authorOwen Anderson <resistor@mac.com>
Tue, 25 Aug 2009 17:26:32 +0000 (17:26 +0000)
committerOwen Anderson <resistor@mac.com>
Tue, 25 Aug 2009 17:26:32 +0000 (17:26 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@80006 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Utils/CodeExtractor.cpp

index ffd88da7bc8d2583639ff682976cf089b3316b0b..a4f312a5ac0dca0f7f6435560376aee23aedb598 100644 (file)
@@ -361,6 +361,17 @@ Function *CodeExtractor::constructFunction(const Values &inputs,
   return newFunction;
 }
 
+static BasicBlock* FindPhiPredForUseInBlock(Value* Used, BasicBlock* BB) {
+  for (Value::use_iterator UI = Used->use_begin(),
+       UE = Used->use_end(); UI != UE; ++UI) {
+     PHINode *P = dyn_cast<PHINode>(*UI);
+     if (P && P->getParent() == BB)
+       return P->getIncomingBlock(UI);
+  }
+  
+  return 0;
+}
+
 /// emitCallAndSwitchStatement - This method sets up the caller side by adding
 /// the call instruction, splitting any PHI nodes in the header block as
 /// necessary.
@@ -540,17 +551,10 @@ emitCallAndSwitchStatement(Function *newFunction, BasicBlock *codeReplacer,
               // then we need to test for dominance of the phi's predecessor
               // instead.  Unfortunately, this a little complicated since we
               // have already rewritten uses of the value to uses of the reload.
-              for (Value::use_iterator UI = Reloads[out]->use_begin(),
-                   UE = Reloads[out]->use_end(); UI != UE; ++UI) {
-                 PHINode *P = dyn_cast<PHINode>(*UI);
-                 if (!P || P->getParent() != OldTarget) continue;
-                 
-                 BasicBlock* pred = P->getIncomingBlock(UI);
-                 if (DT->dominates(DefBlock, pred)) {
-                   DominatesDef = true;
-                   break;
-                 }
-              }
+              BasicBlock* pred = FindPhiPredForUseInBlock(Reloads[out], 
+                                                          OldTarget);
+              if (pred && DT && DT->dominates(DefBlock, pred))
+                DominatesDef = true;
             }
 
             if (DominatesDef) {