[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