CSE used to eliminate all the "if"s in the code below at least in gcc-3.x (and probably even earlier). Now in SVN HEAD it does not do it anymore. 4.1 still does it.
struct s { int a; int b;}; void bar (struct s *ps, int *p, int *__restrict__ rp, int *__restrict__ rq) { ps->a = 0; ps->b = 1; if (ps->a != 0) abort (); p[0] = 0; p[1] = 1; if (p[0] != 0) abort (); rp[0] = 0; rq[0] = 1; if (rp[0] != 0) abort(); } -O2 assembly for SVN HEAD: bar: subl $12, %esp movl 16(%esp), %eax movl 20(%esp), %edx movl 24(%esp), %ecx movl $0, (%eax) movl $1, 4(%eax) movl (%eax), %eax testl %eax, %eax jne .L20 movl $0, (%edx) movl (%edx), %eax movl $1, 4(%edx) testl %eax, %eax jne .L20 movl $0, (%ecx) movl (%ecx), %ecx movl 28(%esp), %eax testl %ecx, %ecx movl $1, (%eax) jne .L20 addl $12, %esp ret .L20: call abort -O2 assembly for 4.1.1 bar: movl 4(%esp), %eax movl 8(%esp), %edx movl $0, (%eax) movl $1, 4(%eax) movl 12(%esp), %eax movl $0, (%edx) movl $1, 4(%edx) movl $0, (%eax) movl 16(%esp), %eax movl $1, (%eax) ret -- Summary: CSE regression Product: gcc Version: 4.3.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: rtl-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: dann at godzilla dot ics dot uci dot edu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30643