https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118316
Andrew Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Last reconfirmed| |2025-01-06
Status|UNCONFIRMED |ASSIGNED
Ever confirmed|0 |1
Keywords| |missed-optimization
Severity|normal |enhancement
Assignee|unassigned at gcc dot gnu.org |pinskia at gcc dot
gnu.org
--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
It comes down to optimizing:
```
unsigned f(unsigned len)
{
if (len > 1)
len &= 1;
return len;
}
```
To just:
`return len & 1;`
Mine for GCC 16.
phiopt match-simplify trying:
len_2(D) > 1 ? len_1 : len_2(D)
Matching expression match.pd:2327, gimple-match-5.cc:64
phiopt match-simplify trying:
len_2(D) <= 1 ? len_2(D) : len_1
len_1 is:
len_1 = len_2(D) & 1;
Should be just as simple as:
/* `(a > 1) ? (a & 1) : a` -> `a & 1` */
(simplify
(cond (gt @0 integer_onep) (and@1 @0 integer_onep) @0))
(if (TREE_UNSIGNED (type))
@1))