public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug tree-optimization/112752] New: `~a - MIN<MIN<~a, ~b>, ~c>` is not optimized to `MAX<MAX<a,b>,c> - a`
@ 2023-11-28 22:32 pinskia at gcc dot gnu.org
  2023-11-28 22:32 ` [Bug tree-optimization/112752] " pinskia at gcc dot gnu.org
  2023-11-28 23:01 ` pinskia at gcc dot gnu.org
  0 siblings, 2 replies; 3+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-11-28 22:32 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 112752
           Summary: `~a - MIN<MIN<~a, ~b>, ~c>` is not optimized to
                    `MAX<MAX<a,b>,c> - a`
           Product: gcc
           Version: 14.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: enhancement
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: pinskia at gcc dot gnu.org
                CC: evstupac at gmail dot com, kirill.yukhin at intel dot com,
                    pinskia at gcc dot gnu.org, rguenth at gcc dot gnu.org,
                    unassigned at gcc dot gnu.org
  Target Milestone: ---
            Target: x86_64-*-*

+++ This bug was initially created as a clone of Bug #52252 +++

This is an example of byte conversion from RGB (Red Green Blue) to CMYK (Cyan
Magenta Yellow blacK):
```
#define byte unsigned char
#define MIN(a, b) ((a) > (b)?(b):(a))

void convert_image(byte *in, byte *out, int size) {
    int i;
    for(i = 0; i < size; i++) {
        byte r = in[0];
        byte g = in[1];
        byte b = in[2];
        byte c, m, y, k, tmp;
        c = 255 - r;
        m = 255 - g;
        y = 255 - b;
        tmp = MIN(m, y);
        k = MIN(c, tmp);
        out[0] = c - k;
        out[1] = m - k;
        out[2] = y - k;
        out[3] = k;
        in += 3;
        out += 4;
    }
}
```

For the scalar (and vectorized versions) we should get instead:
```
#define byte unsigned char
#define MIN(a, b) ((a) > (b)?(b):(a))
#define MAX(a, b) ((a) < (b)?(b):(a))

void convert_image_1(byte *in, byte *out, int size) {
    int i;
    for(i = 0; i < size; i++) {
        byte r = in[0];
        byte g = in[1];
        byte b = in[2];
        byte c, m, y, k, tmp;
        tmp = MIN(r, g);
        k = MIN(b, tmp);
        out[0] = k - r;
        out[1] = k - g;
        out[2] = k - b;
        out[3] = 255 - k;
        in += 3;
        out += 4;
    }
}
```

See bug 52252 comment #10, 11, and 12 also.

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

* [Bug tree-optimization/112752] `~a - MIN<MIN<~a, ~b>, ~c>` is not optimized to `MAX<MAX<a,b>,c> - a`
  2023-11-28 22:32 [Bug tree-optimization/112752] New: `~a - MIN<MIN<~a, ~b>, ~c>` is not optimized to `MAX<MAX<a,b>,c> - a` pinskia at gcc dot gnu.org
@ 2023-11-28 22:32 ` pinskia at gcc dot gnu.org
  2023-11-28 23:01 ` pinskia at gcc dot gnu.org
  1 sibling, 0 replies; 3+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-11-28 22:32 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
I made a small mistake into what it should be optimized to:
The MIN should be MAX (oops):
that is:
        tmp = MAX(r, g);
        k = MAX(b, tmp);

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

* [Bug tree-optimization/112752] `~a - MIN<MIN<~a, ~b>, ~c>` is not optimized to `MAX<MAX<a,b>,c> - a`
  2023-11-28 22:32 [Bug tree-optimization/112752] New: `~a - MIN<MIN<~a, ~b>, ~c>` is not optimized to `MAX<MAX<a,b>,c> - a` pinskia at gcc dot gnu.org
  2023-11-28 22:32 ` [Bug tree-optimization/112752] " pinskia at gcc dot gnu.org
@ 2023-11-28 23:01 ` pinskia at gcc dot gnu.org
  1 sibling, 0 replies; 3+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-11-28 23:01 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Here is a semi-reduced testcase:
```
#define byte unsigned char
#define MIN(a, b) ((a) > (b)?(b):(a))

byte hh(byte r, byte g, byte b) {
  byte c = 255 - r;
  byte m = 255 - g;
  byte y = 255 - b;
  byte tmp = MIN(m, y);
  byte k = MIN(c, tmp);
  return m - k;
}
```
Note matching this directly, the above might not fix the original testcase.

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

end of thread, other threads:[~2023-11-28 23:01 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-11-28 22:32 [Bug tree-optimization/112752] New: `~a - MIN<MIN<~a, ~b>, ~c>` is not optimized to `MAX<MAX<a,b>,c> - a` pinskia at gcc dot gnu.org
2023-11-28 22:32 ` [Bug tree-optimization/112752] " pinskia at gcc dot gnu.org
2023-11-28 23:01 ` 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).