--- Comment #4 from ubizjak at gmail dot com 2010-09-17 09:59 ---
This all happens in IF conversion pass.
4.6 regresses in the sense that a branch is emitted instead of cmov for:
int
summation_helper_1 (long * products, unsigned long count)
{
int s = 0;
unsigned long i;
for (i = 0; i count; i++)
{
int val = (products[i] 0) ? 1 : -1;
products[i] *= val;
if (products[i] != i)
val = -val;
products[i] = val;
s += val;
}
return s;
}
gcc-4.4.4 -O3 produces:
.L16:
movq(%rdi,%rdx,8), %r10
testq %r10, %r10
setg%r8b
xorl%ecx, %ecx
testq %r10, %r10
movzbl %r8b, %r9d
movzbl %r8b, %r8d
setle %cl
leaq-1(%r8,%r8), %r8
leal-1(%rcx,%rcx), %ecx
leal-1(%r9,%r9), %r9d
imulq %r8, %r10
movslq %ecx,%r11
cmpq%r10, %rdx
cmovne %r11, %r8
cmove %r9d, %ecx
movq%r8, (%rdi,%rdx,8)
addq$1, %rdx
addl%ecx, %eax
cmpq%rdx, %rsi
ja .L16
and gcc-4.6 20100917
.L15:
movq(%rdi,%rdx,8), %r8
testq %r8, %r8
movq%r8, %r10
setg%cl
xorl%r9d, %r9d
testq %r8, %r8
movzbl %cl, %r11d
movzbl %cl, %ecx
setle %r9b
leaq-1(%rcx,%rcx), %rcx
leaq-1(%r9,%r9), %r9
imulq %rcx, %r10
cmpq%r10, %rdx
cmove %rcx, %r9
leal-1(%r11,%r11), %ecx
movq%r9, (%rdi,%rdx,8)
je .L12
xorl%ecx, %ecx
testq %r8, %r8
setle %cl
leal-1(%rcx,%rcx), %ecx
.L12:
addq$1, %rdx
addl%ecx, %eax
cmpq%rsi, %rdx
jne .L15
--
ubizjak at gmail dot com changed:
What|Removed |Added
Last reconfirmed|-00-00 00:00:00 |2010-09-17 09:59:36
date||
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45685