[LLVMdev] Unnatural loops with O0

Florian Brandner brandner at complang.tuwien.ac.at
Wed Jun 11 06:27:15 PDT 2008

On Thursday 08 May 2008 18:33:48 Adrian Prantl wrote:
> we noticed that llvmgcc4.2-2.2 sometimes generates non-natural loops
> when compiling to bytecode without any optimizations. Apparently what
> happens is that the loop header is duplicated, which results in two
> entry points for the loop. 

this is actually a problem with the tailduplication pass of llvm. it does not 
consider loops at all, and thus duplicates loop headers. the result is that 
two paths now lead into the loop --> it is not natural anymore and further 
loop optimizations fail. 

besides, the tailduplication pass does not invalidate the loopinfo analysis, 
as it should do in these cases.

i've attached a minimized version of adrians original testcase. you need to 
adjust the tailduplication threshhold to trigger the tailduplication for this 

some more tests, using mibench (+some other benchmarks) with our llvm-2.1 
based compiler, showed that in 29 benchmark programs 19 non-natural loops 
appear - one single function contained 6 of them alone.

all but 5 of them could be avoided using a simple patch that disables tail 
duplication of loop headers - 3 of them in one single function. the patch 
applies and compiles with svn trunk, it also works for the small testcase, 
but i did not run the testsuites.


Brandner Florian

CD Laboratory - Compilation Techniques for Embedded Processors
Institut für Computersprachen E185/1
Technische Universität Wien
Argentinierstraße 8 / 185
A-1040 Wien, Austria

Tel.: (+431) 58801-58521

E-Mail: brandner at complang.tuwien.ac.at
-------------- next part --------------
A non-text attachment was scrubbed...
Name: tailup-loop.c
Type: text/x-csrc
Size: 149 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20080611/43841b2a/attachment.c>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: taildup-loopheader.patch
Type: text/x-diff
Size: 2139 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20080611/43841b2a/attachment.patch>

More information about the llvm-dev mailing list