https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79389

Uroš Bizjak <ubizjak at gmail dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jakub at gcc dot gnu.org

--- Comment #4 from Uroš Bizjak <ubizjak at gmail dot com> ---
The testcase for missing if-conversion:

--cut here--
extern double Random_nextDouble (void);

int foo (int Num_samples)
{
  int count;
  int under_curve = 0;

  for (count=0; count<Num_samples; count++)
    {
      double x= Random_nextDouble ();
      double y= Random_nextDouble ();
      if ( x*x + y*y <= 1.0)
        under_curve ++;
    }

  return under_curve;
}
--cut here--

gcc -O2:

        xorl    %ebx, %ebx
        ...
.L5:
        call    Random_nextDouble
        movsd   %xmm0, 8(%rsp)
        call    Random_nextDouble
        movsd   8(%rsp), %xmm1
++>     leal    1(%rbx), %eax
        mulsd   %xmm0, %xmm0
        mulsd   %xmm1, %xmm1
        movsd   .LC0(%rip), %xmm2
        addsd   %xmm0, %xmm1
        ucomisd %xmm1, %xmm2
-->     cmovnb  %eax, %ebx
        addl    $1, %ebp
        cmpl    %ebp, %r12d
        jne     .L5

gcc -O3 is even more "innovative":

        xorl    %r12d, %r12d
        ...
.L2:
        call    Random_nextDouble
        movsd   %xmm0, 8(%rsp)
        call    Random_nextDouble
        movsd   8(%rsp), %xmm1
        mulsd   %xmm0, %xmm0
        mulsd   %xmm1, %xmm1
        movsd   .LC0(%rip), %xmm2
        addsd   %xmm0, %xmm1
        ucomisd %xmm1, %xmm2
-->     jnb     .L13
        addl    $1, %ebx
        cmpl    %ebx, %ebp
        jne     .L2

.L13:
        addl    $1, %ebx
++>     addl    $1, %r12d
        cmpl    %ebp, %ebx
        jne     .L2

IF-conversion to SETcc + ZEXT + ADD would avoid cmove/jump in this short loop.

(I'm not sure if tree or RTL ifconvert pass should catch this situation.)

Reply via email to