[LLVMdev] problems when the llvm::ExtractCodeRegion updates the Phi nodes in successors ... is there a method to eliminate phi nodes ?

Jimborean Alexandra xinfinity_a at yahoo.com
Sat Mar 12 02:15:07 PST 2011


Hi, 

I use the llvm::ExtractCodeRegion to extract each loop into a separate function, 
but I have a problem when I run this on the SPEC CPU 2006 on the 401.bzip2 
benchmark.  First I use clang -O3 to generate optimized llvm code and then I 
extract some loops from the module built from blocksort.c source file. 

The problem is that the PHI nodes contained in the successors of the codeRepl 
include two or more incoming edges for different blocks contained in the loop. 
Therefore, when the loop is extracted in the new function, these incoming edges 
are updated to have an entry from the codeRepl block instead of the the original 
blocks. But in case there are incoming edges from more blocks belonging to the 
loop, this generates an invalid Phi node which contains multiple entries for the 
codeRepl block. 

I use LLVM 2.8 and in the file CodeExtractor.cpp lines 730 - 745 when the Phi 
nodes in the successors are updated, there is a test to check that the Phi node 
does not contain an entry from the same BasicBlock from the loop. But there is 
no test to check if two different blocks of the loop reach the same phi node. 
(If I correctly understood this part of code... ) 

Did I obtain an invalid loop or this kind of loops are not eligible for 
llvm::ExtractCodeRegion  ?   
Is there any other method to eliminate the PHI nodes except the reg2mem pass? I 
do not want to pollute the code with so many additional load instructions. Is it 
possible to dissolve the PHI nodes without reg2mem? 

Thank you. 
Alexandra


      
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110312/e9cb4c3b/attachment.html>


More information about the llvm-dev mailing list