[llvm-commits] [llvm] r79963 - /llvm/trunk/lib/Transforms/Utils/CodeExtractor.cpp

Owen Anderson resistor at mac.com
Mon Aug 24 17:54:39 PDT 2009


Author: resistor
Date: Mon Aug 24 19:54:39 2009
New Revision: 79963

URL: http://llvm.org/viewvc/llvm-project?rev=79963&view=rev
Log:
Handle a corner case when extracing code regions where one of the immediate successor
of an extracted block contains a PHI using a value defined in the extracted region.

With this patch, the partial inliner now passes MultiSource/Applications.

Modified:
    llvm/trunk/lib/Transforms/Utils/CodeExtractor.cpp

Modified: llvm/trunk/lib/Transforms/Utils/CodeExtractor.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/CodeExtractor.cpp?rev=79963&r1=79962&r2=79963&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/Utils/CodeExtractor.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/CodeExtractor.cpp Mon Aug 24 19:54:39 2009
@@ -369,7 +369,7 @@
                            Values &inputs, Values &outputs) {
   // Emit a call to the new function, passing in: *pointer to struct (if
   // aggregating parameters), or plan inputs and allocated memory for outputs
-  std::vector<Value*> params, StructValues, ReloadOutputs;
+  std::vector<Value*> params, StructValues, ReloadOutputs, Reloads;
   
   LLVMContext &Context = newFunction->getContext();
 
@@ -446,6 +446,7 @@
       Output = ReloadOutputs[i];
     }
     LoadInst *load = new LoadInst(Output, outputs[i]->getName()+".reload");
+    Reloads.push_back(load);
     codeReplacer->getInstList().push_back(load);
     std::vector<User*> Users(outputs[i]->use_begin(), outputs[i]->use_end());
     for (unsigned u = 0, e = Users.size(); u != e; ++u) {
@@ -532,8 +533,25 @@
                 DominatesDef = false;
             }
 
-            if (DT)
+            if (DT) {
               DominatesDef = DT->dominates(DefBlock, OldTarget);
+              
+              // If the output value is used by a phi in the target block,
+              // 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;
+                 }
+              }
+            }
 
             if (DominatesDef) {
               if (AggregateArgs) {





More information about the llvm-commits mailing list