Four ways of coding a conditional assignment yields 1 conditional move using gcc 3.4.5 20051201 (Red Hat 3.4.5-2). gcc 4.0.2 20051130 (Red Hat 4.0.2-14.EL4) produces none. IMHO, four cmov's should have been produced. I further expect all four functions to generates the exact same code.
All recent new commercial compilers tested generates four cmov's: - intel 8.1, 9.0, and 9.1 - pgi 5.2, 6.0, 6.1, and 6.2 - pathscale 2.1, 2.2, 2.3, 2.4 Version-Release number of selected component (if applicable): How reproducible: allways Steps to Reproduce: gcc -O2 -S if_conversion.c;egrep cmov\|^[a-d]: if_conversion.s Actual results: a: b: c: d: cmove %ecx, %esi Expected results: One cmovX per function, four in total. Here is the source code: --------------------------------------------------------------------- /* if construct, near obvious cse */ int a(int c, int a, int b, int o) { int r; if (c) { r = a - b; } else { r = a + o - b; } return r; } /* if construct, absolute obvious cse */ int b(int c, int a, int b, int o) { int r; if (c) { r = a - b; } else { r = a - b + o; } return r; } /* conditional assignment, near obvious cse */ int c(int c, int a, int b, int o) { int r; r = (c) ? a - b : a + o - b; return r; } /* conditional assignment, absolute obvious cse */ int d(int c, int a, int b, int o) { int r; r = (c) ? a - b : a - b + o; return r; } --------------------------------------------------------------------- -- Summary: Missing if-conversion. If-conversion dependent on operand order. Inconsistent if-conversion. Product: gcc Version: 3.4.5 Status: UNCONFIRMED Severity: enhancement Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: Hakon dot Bugge at scali dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29144