[llvm-dev] IR "canonicalization"

Matthias Braun via llvm-dev llvm-dev at lists.llvm.org
Tue Jul 5 16:27:18 PDT 2016


I don't know about clang, but this is usually done by the frontend when constructing IR. The trick is to have two expression evaluators, one that gets a True+False block and evaluates a boolean expression to conditional jumps etc. to those blocks and another one that can evaluate boolean expressions into 0/1 values. The branch version then looks something like this:

emitBranchOnExpression(Expression *E, Block *TrueTarget, Block *FalseTarget) {
    If(E->isNot()) {
        return emitBranchOnExpression(E->operand(), FalseTarget, TrueTarget);
    }
    // ...
}

You usually want the branch version anyway to implement the short-circuit behaviour of && and ||.

- Matthias

> On Jul 5, 2016, at 3:49 PM, Lorenzo Laneve via llvm-dev <llvm-dev at lists.llvm.org> wrote:
> 
> I’m implementing a front-end compiler and I need to do the most basic optimizations to the IR it generates, just like Clang does.
> 
> For example:
> 
> "if not x” becomes:
> 
> %1 = xor %x, true
> br i1 %1 label %2, label %3
> 
> and Clang (even with -O0) just swaps labels:
> 
> bt i1 %x label %3, label %2
> 
> 
> 
> Another optimization is to remove “empty blocks” that simply br to another label:
> 
> br i1 %x label %emp1, label %emp2 
> 
> emp1:
> 	br label %cont
> 
> emp2:
>> 
> which becomes simply:
> 
> br i1 %x label %cont, label %emp2 
> 
> emp2:
>> 
> 
> Is there a pass Clang uses to do these basic optimizations? Where should I look in the Clang source code?
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev



More information about the llvm-dev mailing list