* Dead code elimination PROBLEM
@ 2014-02-13 7:07 chronicle
2014-02-13 8:16 ` Richard Biener
0 siblings, 1 reply; 2+ messages in thread
From: chronicle @ 2014-02-13 7:07 UTC (permalink / raw)
To: gcc
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>:
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
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: Dead code elimination PROBLEM
2014-02-13 7:07 Dead code elimination PROBLEM chronicle
@ 2014-02-13 8:16 ` Richard Biener
0 siblings, 0 replies; 2+ messages in thread
From: Richard Biener @ 2014-02-13 8:16 UTC (permalink / raw)
To: chronicle, gcc
On February 13, 2014 8:07:16 AM GMT+01:00, chronicle <chassin@ceis.cujae.edu.cu> 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
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2014-02-13 8:16 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-02-13 7:07 Dead code elimination PROBLEM chronicle
2014-02-13 8:16 ` Richard Biener
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).