On February 13, 2014 8:07:16 AM GMT+01:00, chronicle
<[email protected]> wrote:
>Hi PPL i developed a plugin that produces the following gimple
>
>test ()
>{
> int selected_fnc_var_.3;
> int random_Var.2;
> int D.2363;
> int _1;
>
> <bb 2>:
> random_Var.2_2 = rand ();
> selected_fnc_var_.3_3 = random_Var.2_2 %[fl] 5;
> if (selected_fnc_var_.3_3 == 4) goto <L7>;
> if (selected_fnc_var_.3_3 == 3) goto <L6>;
> if (selected_fnc_var_.3_3 == 2) goto <L5>;
> if (selected_fnc_var_.3_3 == 1) goto <L4>;
> if (selected_fnc_var_.3_3 == 0) goto <L3>;
><L7>:
> _1 = f.clone.4 ("t", "t");
> goto <L8>;
><L6>:
> _1 = f.clone.3 ("t", "t");
> goto <L8>;
><L5>:
> _1 = f.clone.2 ("t", "t");
> goto <L8>;
><L4>:
> _1 =f.clone.1 ("t", "t");
> goto <L8>;
>
><L8>:
You miss a phi node merging the different _1. Also you cannot assign to _1
multiple times but have to use a new ssa name for each.
Richard.
> if (_1 != 0)
> goto <bb 3>;
> else
> goto <bb 4>;
>
> <bb 3>:
> __builtin_puts (&" f success "[0]);
> goto <bb 5>;
>
> <bb 4>:
> __builtin_puts (&" f failed "[0]);
>
> <bb 5>:
> return;
>
>}
>
>with this final code
>
>00000000004005c6 <test>:
> 4005c6: 55 push %rbp
> 4005c7: 48 89 e5 mov %rsp,%rbp
> 4005ca: 53 push %rbx
> 4005cb: 48 83 ec 08 sub $0x8,%rsp
> 4005cf: e8 6c fe ff ff callq 400440 <rand@plt>
> 4005d4: 89 d9 mov %ebx,%ecx
> 4005d6: c1 f9 1f sar $0x1f,%ecx
> 4005d9: 89 d8 mov %ebx,%eax
> 4005db: 31 c8 xor %ecx,%eax
> 4005dd: ba 67 66 66 66 mov $0x66666667,%edx
> 4005e2: f7 e2 mul %edx
> 4005e4: 89 d0 mov %edx,%eax
> 4005e6: d1 e8 shr %eax
> 4005e8: 31 c8 xor %ecx,%eax
> 4005ea: 89 c2 mov %eax,%edx
> 4005ec: c1 e2 02 shl $0x2,%edx
> 4005ef: 01 c2 add %eax,%edx
> 4005f1: 89 d8 mov %ebx,%eax
> 4005f3: 29 d0 sub %edx,%eax
> 4005f5: 83 f8 04 cmp $0x4,%eax
> 4005f8: 75 32 jne 40062c <test+0x66>
> 4005fa: 83 f8 03 cmp $0x3,%eax
> 4005fd: 74 2d je 40062c <test+0x66>
> 4005ff: 83 f8 02 cmp $0x2,%eax
> 400602: 74 28 je 40062c <test+0x66>
> 400604: 83 f8 01 cmp $0x1,%eax
> 400607: 74 23 je 40062c <test+0x66>
> 400609: 85 c0 test %eax,%eax
> 40060b: 74 1f je 40062c <test+0x66>
> 40060d: be bc 09 40 00 mov $0x4009bc,%esi
> 400612: bf c6 09 40 00 mov $0x4009c6,%edi
> 400617: e8 7d 02 00 00 callq 400899 <f.clone.4>
> 40061c: 85 c0 test %eax,%eax
> 40061e: 75 0c jne 40062c <test+0x66>
> 400620: bf d0 09 40 00 mov $0x4009d0,%edi
> 400625: e8 e6 fd ff ff callq 400410 <puts@plt>
> 40062a: eb 0a jmp 400636 <test+0x70>
> 40062c: bf e8 09 40 00 mov $0x4009e8,%edi
> 400631: e8 da fd ff ff callq 400410 <puts@plt>
> 400636: 48 83 c4 08 add $0x8,%rsp
> 40063a: 5b pop %rbx
> 40063b: 5d pop %rbp
> 40063c: c3 retq
>
>
>from this gimple
>
>test(){
>
>int D.2363;
> int _1;
>
> <bb 2>:
> _1 = f("t", "t");
> if (_1 != 0)
> goto <bb 3>;
> else
> goto <bb 4>;
>
> <bb 3>:
> __builtin_puts (&" f "[0]);
> goto <bb 5>;
>
> <bb 4>:
> __builtin_puts (&" f "[0]);
>
> <bb 5>:
> return;
>}
>
>as you can see in the dis output code, its only make call to f.clone.4
>( callq 400899 <f.clone.4> ), i suppose is the dead code elimination
>pass is the responsable of this action, i tryed to disable it using -O0
>
>compilation option but without success. my question is how can i make
>the compiler produce the final code without deleting those dead codes
>portion ( do i need to make any kind of PHI nodes in the labels to
>achive that, if so how could i do that ? )
>
>thanks in advance