https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109722
Bug ID: 109722
Summary: ABSU<a> == 0 is not optimized to just a == 0
Product: gcc
Version: 14.0
Status: UNCONFIRMED
Keywords: missed-optimization
Severity: enhancement
Priority: P3
Component: tree-optimization
Assignee: pinskia at gcc dot gnu.org
Reporter: pinskia at gcc dot gnu.org
Target Milestone: ---
Take:
```
int f(signed char a)
{
int t = a;
if (t < 0) t = -t;
a = t;
return a == 0;
}
```
Right now this gets optimized to just:
```
_9 = ABSU_EXPR <a_3(D)>;
_1 = _9 == 0;
_7 = (int) _1;
```
If we change `signed char` to `unsigned char`, we get:
_1 = a_2(D) == 0;
_3 = (int) _1;
As we had expected for the original case too.
The fix is to change in match.pd:
/* Convert ABS_EXPR<x> == 0 or ABS_EXPR<x> != 0 to x == 0 or x != 0. */
(for op (eq ne)
(simplify
(op (abs @0) zerop@1)
(op @0 @1)))
to:
/* Convert ABS[U]_EXPR<x> == 0 or ABS[U]_EXPR<x> != 0 to x == 0 or x != 0. */
(for op (abs absu)
(for eqne (eq ne)
(simplify
(eqne (op @0) zerop@1)
(eqne @0 @1)))