public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c/29144]  New: Missing if-conversion. If-conversion dependent on operand order. Inconsistent if-conversion.
@ 2006-09-19 15:51 Hakon dot Bugge at scali dot com
  2009-02-06 20:58 ` [Bug rtl-optimization/29144] " steven at gcc dot gnu dot org
  0 siblings, 1 reply; 4+ messages in thread
From: Hakon dot Bugge at scali dot com @ 2006-09-19 15:51 UTC (permalink / raw)
  To: gcc-bugs

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


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [Bug rtl-optimization/29144] Missing if-conversion. If-conversion dependent on operand order. Inconsistent if-conversion.
  2006-09-19 15:51 [Bug c/29144] New: Missing if-conversion. If-conversion dependent on operand order. Inconsistent if-conversion Hakon dot Bugge at scali dot com
@ 2009-02-06 20:58 ` steven at gcc dot gnu dot org
  0 siblings, 0 replies; 4+ messages in thread
From: steven at gcc dot gnu dot org @ 2009-02-06 20:58 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #1 from steven at gcc dot gnu dot org  2009-02-06 20:58 -------
The "near obvious cse" cases are not obvious (requires reassociation). To make
them redundant, you need code hoisting.


-- 

steven at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
  BugsThisDependsOn|                            |23286
             Status|UNCONFIRMED                 |NEW
     Ever Confirmed|0                           |1
   Last reconfirmed|0000-00-00 00:00:00         |2009-02-06 20:58:37
               date|                            |


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29144


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [Bug rtl-optimization/29144] Missing if-conversion. If-conversion dependent on operand order. Inconsistent if-conversion.
       [not found] <bug-29144-4@http.gcc.gnu.org/bugzilla/>
  2021-08-18 21:35 ` pinskia at gcc dot gnu.org
@ 2023-06-02  6:04 ` pinskia at gcc dot gnu.org
  1 sibling, 0 replies; 4+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-06-02  6:04 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=29144

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
         Depends on|                            |64700
           See Also|                            |https://gcc.gnu.org/bugzill
                   |                            |a/show_bug.cgi?id=64700

--- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
a, c is really just another case of PR 64700.

b and d are already optimized on the gimple level by PRE to:
```
  _10 = a_4(D) - b_5(D);
  if (c_3(D) != 0)
    goto <bb 4>; [50.00%]
  else
    goto <bb 3>; [50.00%]

  <bb 3> [local count: 536870913]:
  r_7 = o_6(D) + _10;

  <bb 4> [local count: 1073741824]:
  # r_2 = PHI <_10(2), r_7(3)>
```


Referenced Bugs:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64700
[Bug 64700] Sink common code through PHI

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [Bug rtl-optimization/29144] Missing if-conversion. If-conversion dependent on operand order. Inconsistent if-conversion.
       [not found] <bug-29144-4@http.gcc.gnu.org/bugzilla/>
@ 2021-08-18 21:35 ` pinskia at gcc dot gnu.org
  2023-06-02  6:04 ` pinskia at gcc dot gnu.org
  1 sibling, 0 replies; 4+ messages in thread
From: pinskia at gcc dot gnu.org @ 2021-08-18 21:35 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=29144

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
      Known to work|                            |10.1.0, 8.1.0

--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
For i686 (-m32), GCC does cmov for all functions since GCC 8.1.0; with GCC 10+
having the best code gen so far (there is another bug report about improving
similar functions already).

For x86_64, GCC does cmov for all functions since GCC 4.6.0

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2023-06-02  6:04 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-09-19 15:51 [Bug c/29144] New: Missing if-conversion. If-conversion dependent on operand order. Inconsistent if-conversion Hakon dot Bugge at scali dot com
2009-02-06 20:58 ` [Bug rtl-optimization/29144] " steven at gcc dot gnu dot org
     [not found] <bug-29144-4@http.gcc.gnu.org/bugzilla/>
2021-08-18 21:35 ` pinskia at gcc dot gnu.org
2023-06-02  6:04 ` pinskia at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).