This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Re: "if (i == n) ++i;" or "i += i == n;"?
- From: Andrew Haley <aph at redhat dot com>
- To: Erik <sigra at home dot se>
- Cc: gcc-help at gcc dot gnu dot org
- Date: Fri, 19 Jan 2007 13:48:37 +0000
- Subject: Re: "if (i == n) ++i;" or "i += i == n;"?
- References: <45B0C9EC.4040806@home.se>
Erik writes:
> Suppose that we have a function f that can be written in 2 ways with
> identical result:
> unsigned int f(unsigned int i, unsigned int n) {++i; if (i == n) ++i;
> return i;}
> unsigned int f(unsigned int i, unsigned int n) {++i; i += i == n; return i;}
>
> g++ -O3 produces different code for the 2 versions:
> pushl %ebp
> .LCFI0:
> + xorl %edx, %edx
> movl %esp, %ebp
> .LCFI1:
> - movl 8(%ebp), %edx
> - leal 1(%edx), %eax
> + movl 8(%ebp), %eax
> + incl %eax
> cmpl 12(%ebp), %eax
> - je .L6
> popl %ebp
> - ret
> - .p2align 4,,7
> -.L6:
> - popl %ebp
> - leal 2(%edx), %eax
> + sete %dl
> + addl %edx, %eax
> ret
> .LFE2:
>
> This implies that one of the following 3 statements holds:
> 1. The 2 versions of f are indeed not identical.
> 2. The 2 versions of the generated code are equally efficient, so the
> difference does not matter.
> 3. g++ generates suboptimal code for one of the versions of f.
>
> Anyone knows which statement holds.
Probably 3. Looking at the optimized code dump, we have:
unsigned int f1(unsigned int, unsigned int) (i, n)
{
unsigned int i.24;
<bb 2>:
i.24 = i + 1;
if (i.24 == n) goto <L0>; else goto <L1>;
<L0>:;
i.24 = i.24 + 1;
<L1>:;
return i.24;
}
unsigned int f2(unsigned int, unsigned int) (i, n)
{
unsigned int i.49;
unsigned int D.2439;
<bb 2>:
i.49 = i + 1;
D.2439 = i.49 == n;
return D.2439 + i.49;
}
I note that identical code is generated for the two functions at -O1.
I don't know which is faster.
Andrew.