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

    <tr>
        <th>Summary</th>
        <td>
            [X86] regalloc fails for leaf function requiring 15 registers with `"frame-pointer"="non-leaf"`
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:X86
      </td>
    </tr>

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

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

<pre>
    Reproducer: https://clang.godbolt.org/z/3veoajz7P

The inline assembly in the IR in the repro requires 14 registers + `ecx` which should be available given that this is a leaf function.

This was introduced in https://github.com/llvm/llvm-project/pull/146638.

The patch uses `TargetPointer::FramePointerIsReserved` to check whether the `rbp` should be reserved. `TargetPointer::FramePointerIsReserved` returns true even if `"frame-pointer"="non-leaf"` but doesn't check whether the MachineFunction in question is actually non-leaf.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyUk0FvozAQhX-NuYyKwMQEDhxSRUg9rFRVPezVmAG7dezUYyfb_vqV00TdSnvpCcvg5_fefEgiszrEgYl7JvaFTFH7MPgDBlcXk5_fhyc8Bj8nhYE1O9AxHok1O8ZHxkdlpVvL1c-Tt7H0YWV8_GB8bE7o5cvH9pFVO1btnjWCcdY4BEmEh8m-g3EQNcLD020V8j0Q8C2ZgAT1BgKuhiIGAsbvgbUVqj-sreCsjdJA2ic7w4QgT9JYOVmE1Zwwq8kIURsCQyDBolxgSU5F4115c2QIzpLAuPiZbs4-vqdbTdRpKpU_MD5ae7o97o7Bv6CKjI_HZC3jY71p26Yrv9IeZVQaEiFl388yrBgfvXHx0iJrdmOQB7zuPNATEoYTzjld9KA0qlc4a4waw6Uc1lZhOubXX7HD9VD54ysCxhQcQQwJAXNlZskijPMlH7o7XnU4Z82ece68u8s15o22gilFmD2SY3wb_-P2l1TaOByvnedm3xLS55pAqpikte9wky2LeWjmvullgUO9FaLltej6Qg-iqzrZikV03Yzbfuq2qHhVVVPdtBvR8cIMvOKi6uq-bpt-05eykdtJLNjObc873rFNhQdpbJknlxEtDFHCoRabZtsXVk5o6YI_55NUr-hm1ux-d23OKvZFGC4jn9JKbFNZQ5G-pKKJ9vLv5O_FPhMrrfUKFmksweLDd_queBu3Qi3-4ftsov7BAIoU7PBjVi-5KdP6Gf008L8BAAD__7PKUCw">