[Bug tree-optimization/79389] [7 Regression] 30% performance regression in SciMark2 MonteCarlo
rguenther at suse dot de
gcc-bugzilla@gcc.gnu.org
Wed Feb 22 10:29:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79389
--- Comment #5 from rguenther at suse dot de <rguenther at suse dot de> ---
On Wed, 22 Feb 2017, ubizjak at gmail dot com wrote:
> 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.)
There is only RTL ifconvert left.
More information about the Gcc-bugs
mailing list