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

--- Comment #15 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
For the ^/!= case here are the missing optimizations (note == can be handled
too):
```
int ltgtxor(int a, int b)
{
        _Bool c = a < b;
        _Bool d = a > b;
        return c ^ d; // a != b
}

int lteqxor(int a, int b)
{
        _Bool c = a < b;
        _Bool d = a == b;
        return c ^ d; // a <= b (basically | here)
}

int ltnexor(int a, int b)
{
        _Bool c = a < b;
        _Bool d = a != b;
        return c ^ d; // a > b
}
int legexor(int a, int b)
{
        _Bool c = a <= b;
        _Bool d = a >= b;
        return c ^ d; // a != b
}

int leeqxor(int a, int b)
{
        _Bool c = a <= b;
        _Bool d = a == b;
        return c ^ d; // a < b
}

int lenexor(int a, int b)
{
        _Bool c = a <= b;
        _Bool d = a != b;
        return c ^ d; // a >= b
}

```

Match pattern I think:
```
(for op (bit_xor ne)
 (for cmp1 (lt lt lt le le le)
      cmp2 (gt eq ne ge eq ne)
      rcmp (ne le gt ne lt ge)
  (simplify
   (op:c (cmp1:c @0 @1) (cmp2:c @0 @1))
   (rcmp @0 @1))))
```

For eq:
```
(for cmp1 (lt lt lt le le le)
     cmp2 (gt eq ne ge eq ne)
     rcmp (eq ge le eq ge lt)
 (simplify
  (eq:c (cmp1:c @0 @1) (cmp2:c @0 @1))
  (rcmp @0 @1)))
```

Both of these this check though:
(INTEGRAL_TYPE_P (TREE_TYPE (@0)) || POINTER_TYPE_P (TREE_TYPE (@0)))

Reply via email to