[llvm-commits] [llvm] r140083 - /llvm/trunk/lib/Transforms/Utils/CodeExtractor.cpp
Duncan Sands
baldrick at free.fr
Tue Sep 20 00:32:27 PDT 2011
Hi Bill,
> If we are extracting a basic block that ends in an invoke call, we must also
> extract the landing pad block. Otherwise, there will be a situation where the
> invoke's unwind edge lands on a non-landing pad.
>
> We also forbid the user from extracting the landing pad block by itself. Again,
> this is not a valid transformation.
>
> 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=140083&r1=140082&r2=140083&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Utils/CodeExtractor.cpp (original)
> +++ llvm/trunk/lib/Transforms/Utils/CodeExtractor.cpp Mon Sep 19 18:00:52 2011
> @@ -664,7 +664,13 @@
> // * Pass in uses as args
> // 3) Move code region, add call instr to func
> //
> - BlocksToExtract.insert(code.begin(), code.end());
> + for (std::vector<BasicBlock*>::const_iterator
> + I = code.begin(), E = code.end(); I != E; ++I) {
> + BasicBlock *BB = *I;
> + BlocksToExtract.insert(BB);
> + if (InvokeInst *II = dyn_cast<InvokeInst>(BB->getTerminator()))
> + BlocksToExtract.insert(II->getUnwindDest());
> + }
I think the design of ExtractCodeRegion is that the caller should already have
taken care of this kind of thing. For example, take a look at the following
lines (// Assumption: this is a single-entry code region, ...).
>
> Values inputs, outputs;
>
> @@ -788,6 +794,7 @@
> /// ExtractBasicBlock - slurp a basic block into a brand new function
> ///
> Function* llvm::ExtractBasicBlock(BasicBlock *BB, bool AggregateArgs) {
> + if (BB->isLandingPad()) return 0;
Wouldn't it be better to put this logic in CodeExtractor::isEligible?
Ciao, Duncan.
More information about the llvm-commits
mailing list