[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