[LLVMdev] How to Store variable allocation in Registers

Avinash Bole boleavinash at gmail.com
Tue May 12 03:56:47 PDT 2015


Thank you

On Tue, May 12, 2015 at 2:49 AM, Bruce Hoult <bruce at hoult.org> wrote:

> Is there a way to stop dead code elimination? Yes of course. Use the
> results!
>
> Why would you want to keep useless code, the results of which are not
> visible to the rest of the program? That's exactly what we want an
> optimiser framework like LLVM to do.
>
> If you write a C function like ...
>
> void foo(){
>   int v1 = 2 + 10;
>   int v2 = v1 + 3;
>   int v3 = 3 - 2;
>   int v4 = v3 - 5;
>   int v5 = 4 ^ 4;
>   int v6 = v5 ^ v5;
>   int v7 = 5 | v4;
>   int v8 = v4 & 2;
>   int v9 = 7 | 2;
>   int v10 = v8 | v6;
>   int v11 = v9 & v10;
>   return;
> }
>
> ... then Clang (or gcc) will generate just a return instruction (and maybe
> saving/restoring a frame pointer for debugging purposes, depending on ABI)
> with any optimisation level of -O1 or more.
>
> If you use -O0 then a stack frame will be generated, and all variable
> accesses will be to the stack frame, not registers. Again, for debugging
> purposes.
>
>
> On Mon, May 11, 2015 at 2:08 PM, Avinash Bole <boleavinash at gmail.com>
> wrote:
>
>> Hi Bruce!!
>>
>> Im using "C" language.
>>
>> As you said...,i tried using Global pointer..,but i still am not able to
>> get the Registers exactly as i wanted.
>>
>> I found "-mem2reg" as a better alternative. But Problem is even though
>> the resulting Intermediate file( .ll ) is
>> good...,the final assembly file( .s) file is making a lot of DCE.
>>
>> Im Posting an example :
>>
>>
>> *Original Intermediate file :*
>>
>> define void @main() #0 {
>>   %a = alloca i32, align 4
>>   %b = alloca i32, align 4
>>   %c = alloca i32, align 4
>>   store i32 2, i32* %a, align 4
>>   store i32 3, i32* %b, align 4
>>   store i32 4, i32* %c, align 4
>>   %1 = load i32* %a, align 4
>>   %2 = add nsw i32 %1, 10
>>   store i32 %2, i32* %a, align 4
>>   %3 = load i32* %a, align 4
>>   %4 = load i32* %b, align 4
>>   %5 = add nsw i32 %3, %4
>>   store i32 %5, i32* %a, align 4
>>   store i32 5, i32* %a, align 4
>>   %6 = load i32* %b, align 4
>>   %7 = sub nsw i32 %6, 2
>>   store i32 %7, i32* %b, align 4
>>   %8 = load i32* %b, align 4
>>   %9 = load i32* %a, align 4
>>   %10 = sub nsw i32 %8, %9
>>   store i32 %10, i32* %b, align 4
>>   %11 = load i32* %c, align 4
>>   %12 = xor i32 %11, 4
>>   store i32 %12, i32* %c, align 4
>>   %13 = load i32* %c, align 4
>>   %14 = load i32* %c, align 4
>>   %15 = xor i32 %13, %14
>>   store i32 %15, i32* %c, align 4
>>   %16 = load i32* %a, align 4
>>   %17 = load i32* %b, align 4
>>   %18 = or i32 %16, %17
>>   store i32 %18, i32* %a, align 4
>>   %19 = load i32* %b, align 4
>>   %20 = and i32 %19, 2
>>   store i32 %20, i32* %b, align 4
>>   store i32 7, i32* %a, align 4
>>   %21 = load i32* %a, align 4
>>   %22 = or i32 %21, 2
>>   %23 = load i32* %b, align 4
>>   %24 = load i32* %c, align 4
>>   %25 = or i32 %23, %24
>>   %26 = and i32 %22, %25
>>   store i32 %26, i32* %b, align 4
>>   ret void
>> }
>>
>>
>> *After using "-mem2reg"*:
>>
>> define void @main() #0 {
>>   %1 = add nsw i32 2, 10
>>   %2 = add nsw i32 %1, 3
>>   %3 = sub nsw i32 3, 2
>>   %4 = sub nsw i32 %3, 5
>>   %5 = xor i32 4, 4
>>   %6 = xor i32 %5, %5
>>   %7 = or i32 5, %4
>>   %8 = and i32 %4, 2
>>   %9 = or i32 7, 2
>>   %10 = or i32 %8, %6
>>   %11 = and i32 %9, %10
>>   ret void
>> }
>>
>> *Assembly file:*
>>
>>  Return;
>>
>>
>> As you can see...,all the code is eliminated as dead code...,now is there
>> a possibility to stop Dead code elimination?
>>
>>
>>
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150512/74a15375/attachment.html>


More information about the llvm-dev mailing list