[LLVMdev] Promote constant expressions to registers

John Criswell criswell at illinois.edu
Sat Sep 28 12:22:51 PDT 2013

On 9/28/13 12:17 PM, Marcelo Sousa wrote:
> Hello,
> Is there a way to generate LLVM IR without constant expressions by
> promoting constant expressions to registers?
> e.g.:
>    %tmp1 = tail call i8* @foo(i8* bitcast (i32* @x to i8*), i8* %tmp, i64 4) #1
> would be converted to:
>    %tmp1 = bitcast i32* @x to i8*
>    %tmp2 = tail call i8* @foo(i8* %tmp1, i8* %tmp, i64 4) #1
> I find quite inconvenient and redundant to maintain constant
> expressions when they are a subset of the instruction set. Are
> constant expressions being highly exploited for a particular set of
> optimizations?

Constant expressions, I believe, are used by the optimizations and code 
generators to create more efficient code.  The best way to think of them 
is as symbolic constants.

SAFECode has a pass that can convert various constant expressions into 
LLVM instructions. It is the BreakConstantGEPs pass 
The URL points to the version in the release_32 branch that works with 
LLVM 3.2.  The version in SAFECode trunk should work with LLVM 3.3, but 
I haven't tested it much myself.

In my experience, converting constant expressions to instructions hurts 
the performance of the resulting code.  Therefore, you should avoid it 
if at all possible.  If you must transform a constant expression to an 
instruction, you should convert as few of them as possible (which is an 
enhancement that I need to make to SAFECode at some point).

-- John T.

> Regards,
> Marcelo
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev

More information about the llvm-dev mailing list