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.)