[cfe-dev] SSA form in Clang

David Chisnall David.Chisnall at cl.cam.ac.uk
Wed May 6 03:27:45 PDT 2015


On 5 May 2015, at 07:07, Hayden Livingston <halivingston at gmail.com> wrote:
> 
>  I realized that after looking through all the
> code that goes into identifying loops in LLVM IR. We already know
> we're in a loop at the source code level

It’s not quite so clear cut.  For example, consider the following:

do { … } while (0);

Looks like a loop in the AST, but clearly isn’t in the IR.  This is a common idiom in code that lives in macros.

Or what about:

retry:
	…
	if (fail) goto retry;

Doesn’t look like a loop in the AST, but clearly is in the IR.  Loop nests are also often quite different in structure after inlining.  Part of the point of doing this in the IR, rather than in a higher-level representation, is that it allows for better canonicalisation.  For example, you don’t need to special case all of the variations on:

while(1)
for(;;)
do {} while(1)

You also can detect increment conditions much more accurately, whether or not the programmer has put them in the increment part of a for loop.

Programmers tend to be surprised if switching between a for loop and a while loop impacts code generation.  Doing the loop optimisations after canonicalisation makes this much less likely to happen.

David





More information about the cfe-dev mailing list