<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/57034>57034</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [AArch64] Uneccesary `mov` when argument to `ccmp` is negative
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:AArch64,
            missed-optimization
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          Kmeakin
      </td>
    </tr>
</table>

<pre>
    When the argument to `ccmp` is a negative literal, clang pass the negative argument to `ccmp` via a register, which requires an additional `mov` instruction. The more efficient assembly code should use `ccmn`, which can encode negative literals as immediate values. 

Example ([godbolt](https://godbolt.org/z/snzKch6cG)):
```c
#include <stdbool.h>
#include <stdint.h>

bool f(uint32_t w0, uint32_t w1) { return w0 == -1 && w1 == -2; }
```

Clang produces:
```
cmn w0, #1
mov w8, #-2
ccmp w1, w8, #0, eq
cset w0, eq
ret
```

GCC produces:
```
cmn w0, #1
ccmn w1, #2, 0, eq
cset w0, eq
ret
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJydVEtv2zAM_jXyRahhyY8mBx_SpOuh1w07DrLE2FplKZXkZO2vH-U4TdGhAzaAscKHPn6kSXdOvbTfB7A0DkCF76cRbKTRUdIUUo4HPKgOVFALvYj6CNToCF4YwrdUGmF7ehAhzNffQj7BOWqBQB56HRAiAZwGLQe0PE_aA2axVCilo3ZWmHRzdMeZgA3RTzLZc_oVM43OA4X9Xkud0iABGDvzQqVTQMPgJqPoFGBJbvG4ZpOYBewc-bEmZBCoHkdQWkSgR2EmCDklxY4Um_Pz_pcYDwaR-YrUd71TnTOR1DvUhxgPgZQbwr-gLK7c-R61V_wF-_ooh0Y-EL5OUi6Qid0sctF5qa00ExIk5TZExHEmH0h5_4lf2_jePT_THbpHVhN6S_4j0tPcg6vKkAMlt3fY_jh5i36E26HQG4blNSgY9GbjpLzD8N0Hzu9zbs_j4J2aJIQ_6zur-D4WLlgIO9vwPdPTarFhqnMgjs1Mc3v1zffgeQkIcCnrYsJa_kLwYbv9L3pyNrLFyNP570QyaFnTFMVtVRU8U22p1uVaZFFHAy3O0mbjcToqnCX6zYJEisK_vFuCU9rSzzf0MsvZ5E37YRR1HKYul25ExZjj5bjBXvwEGVHVIeCo45_6tiirbGihZo1UpWSMrfZdtYZGVmXF6lI0qlx1dWZEByYk4oTzTsgnsAozXqrg_NwtPiI0qBt3iHrUryLtcHLWu0y3vOC8WBVrtq6aiuWgeL2v94xBvdpL0ZGqgFFokyeyaZEy3868u6kP6DT4HQlXJ34FdG9hbmbCF1McnG8fRxBP2mZzie1c3299NHg8">