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.