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

Reply via email to