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

    <tr>
        <th>Summary</th>
        <td>
            [inline asm][X86] Inline assembly 'g' constraint seem to always prefer memory over registers on x86
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:X86,
            llvm:optimizations
      </td>
    </tr>

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

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

<pre>
    For some reason, when creating Selection DAG for inline asm call with `imr` (IR equivalent to the `g`) constraint LLVM always creates a store to the stack, even when the variable is already in the register, so it should be "free".
AArch64 backend and GCC don't appear to do that.

See https://godbolt.org/z/hGcjEqr4a
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJxdUk1v2zAM_TX2hVggyx9xDj54yRoU6C4rMOwqS7StTrZcSU6W_vpRboMOA0yRFEXy8dGdVbfmwTrwdkJwKLydE36E64gzSPKDngd4RoMyaDvDqT1DT8_1bPSMIPwEUhgDVx1GSCqmJ0cnJLx-_AH4uuqLMDgHCBbCiPHFQJLwA0g7--CEpuDT08_vIMxV3Px7T_QgwAfr8J7og5C_IzC8ELANXby-CKdFZxA0ZRhKVTeCtoUcDtoHdDHJW9AB_GhXo6AjGJz3DpHULmGnhLVt6-RYFdBRF5wVCJLz8QgqsrEPIJYFhYtgVMQjwkfe-_mMCGMIi0_yNuEP9A1WddaEnXUDeW8k41m-fHt1hUhVk6tDfhBp0MFgk5RfP8lMyhP5v-qKDHi8X3ucOnMj1Huqtv-XOY84RVQf5C0Oe3Qw4WTdDeyF7DsNHmh7f-oqXZ1p_gNLu1u7nbQTOcZc7urL4uwL7Z1c7f2KnoyyyPZ5OjYZK0tV9bzuyoxlvKv7ssgZqwolM9HJQ2pEh8bH6YjlD1qpYxyN87gTUluvvLVL0JN-E_EH8zFanlLdcMY5y1me5eWhrHeZ7PuD7Kl2TZ1ZlRQMJ6HNLhaJPKeu2UB36-ApaGhq_xkkEvUw40Z3rC_WMFrXKDFrIyaTbgM223R_ATaxAP8">