[llvm-commits] [llvm] r85692 - /llvm/trunk/lib/Transforms/Scalar/GVN.cpp
Chris Lattner
clattner at apple.com
Sun Nov 1 09:39:34 PST 2009
On Oct 31, 2009, at 11:35 PM, Owen Anderson wrote:
>> /// performPRE - Perform a purely local form of PRE that looks for
>> diamond
>> /// control flow patterns and attempts to perform simple PRE at the
>> join point.
>> -bool GVN::performPRE(Function& F) {
>> +bool GVN::performPRE(Function &F) {
>> bool Changed = false;
>> SmallVector<std::pair<TerminatorInst*, unsigned>, 4> toSplit;
>> DenseMap<BasicBlock*, Value*> predMap;
>> @@ -1875,6 +1875,10 @@
>> // we would need to insert instructions in more than one pred.
>> if (NumWithout != 1 || NumWith == 0)
>> continue;
>> +
>> + // Don't do PRE across indirect branch.
>> + if (isa<IndirectBrInst>(PREPred->getTerminator()))
>> + continue;
>>
>> // We can't do PRE safely on a critical edge, so instead we
>> schedule
>> // the edge to be split and perform the PRE the next time we
>> iterate
>>
>
> This isn't correct. PREPred is the block in which the expression is
> already computed, so it never needs to split that edge. What you
> need to check is that none of the other predecessors is via an
> indirect branch, as PRE would possibly need to split those edges to
> insert instructions.
>
How do I do that? I'm really interested in just disabling pre across
indirect branches.
-Chris
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20091101/9feb7e69/attachment.html>
More information about the llvm-commits
mailing list