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

Chris Lattner clattner at apple.com
Mon Aug 24 22:33:12 PDT 2009


On Aug 24, 2009, at 5:54 PM, Owen Anderson wrote:

> 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.

Very nice Owen.  Please pull the loop out to a static helper function  
though,
http://llvm.org/docs/CodingStandards.html#hl_predicateloops

-Chris

>
> 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) {
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list