public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
* 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).