https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112304
Bug ID: 112304
Summary: cinc is not being used for (small) constant
Product: gcc
Version: 14.0
Status: UNCONFIRMED
Keywords: missed-optimization
Severity: enhancement
Priority: P3
Component: target
Assignee: pinskia at gcc dot gnu.org
Reporter: pinskia at gcc dot gnu.org
Target Milestone: ---
Target: aarch64-linux-gnu
Take:
```
int f(int a)
{
return (a!=0)+42;
}
int f1(int a, int b)
{
return (a!=0)+b;
}
```
Currently we get:
```
f:
cmp w0, 0
cset w0, ne
add w0, w0, 42
ret
f1:
cmp w0, 0
cinc w0, w1, ne
ret
```
But f should really be:
```
mov w1, #42
cmp w0, #0
cinc w0, w1, ne
ret
```
Because for many newer aarch64 cores the `mov` in this case is "free" and does
not take up an issue slot or even the for a dual issue, the mov and cmp could
be issued together. Even though it is the same # of instruction, the second
case is going to be faster due to latencies.