https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117346
Bug ID: 117346
Summary: ccmp does not go through canonicalize_comparison
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Keywords: missed-optimization
Severity: enhancement
Priority: P3
Component: middle-end
Assignee: pinskia at gcc dot gnu.org
Reporter: pinskia at gcc dot gnu.org
Blocks: 85605
Target Milestone: ---
Take (before the patch for PR 85605):
```
static inline int
GT (unsigned int x)
{
return x > 0xfefffffe;
}
int
check1 (int x, int y)
{
if (GT (x) && x > y)
return 100;
return x;
}
int
check (int x, int y)
{
if ( x > y && GT (x))
return 100;
return x;
}
```
Right now check produces:
```
mov w1, -16777217
cmp w0, w1
mov w1, 100
csel w0, w0, w1, cc
```
While check1 produces:
```
mov w1, 65534
movk w1, 0xfeff, lsl 16
ccmp w0, w1, 0, gt
```
Which is the same except check is smaller. That is due to going through
canonicalize_comparison which was added in r9-2428-gec18e48eaa0d7e . But the
ccmp generation does not go through emit_store_flag_1 or prepare_cmp_insn so
this optimization is missed.
Referenced Bugs:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85605
[Bug 85605] Potentially missing optimization under x64 and ARM: seemingly
unnecessary branch in codegen