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

    <tr>
        <th>Summary</th>
        <td>
            Missed optimization: JMP to RET
        </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>
          dvyukov
      </td>
    </tr>
</table>

<pre>
    Source:
```
bool foo(long a) {
    asm goto("testq %[a], %[a]; jz %l[label1]"
 :: [a]"r"(a) :: label1, label2);
    return true;
    label1:
 asm goto("nop" :: [a]"r"(a) :: label2);
    return true;
 label2:
    return false;
}
```

Clang generates:
```
foo(long):                                # @foo(long)
        movb    $1, %al
        testq   %rdi, %rdi
 je      .LBB0_3
.LBB0_2:
        retq
.LBB0_3: # Block address taken
        nop
        jmp .LBB0_2
.LBB0_1:                                # Block address taken
 xorl    %eax, %eax
 retq
```

https://godbolt.org/z/szK88eYPE

JMP directly to RET instruction (.LBB0_2) does not look profitable.
It can be replaced with RET. RET is shorter and fewer instruction executed.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyMVE1v4zYQ_TWjy2ANaWhG0kEHO14D_Vhg0fbQngpKGtuMadFLUtkkv76gqMT2YlNEMGyS8968mXmmlPd6PzA3INcgN5kaw8G6pn98Ho_2MWtt_9z8aUfXMYgV5BvIV3CXz59p21prcGctUGXssEcFVCOU6xRFRFT-hHsbIgKIAvvwDYEkyLUCuQG6v96JNT68xAMDcm1Uy6aYQDTni2WIFb6RycUYVUk2BWca3acVAdUgrgpyHEY3YHAj35zPvNdGfyh8sGcg-ngBH5OdoW-aF9xOGX8BQrn56fjT971Rwx73PLBTgf17Xl1smmqb1P7vARIIy_yW9lZnfE72sU3IZTE7qcwtJBkeIdL1egbFVUI9cIItfl-v839FOk2b27HMo_l2jRCTFSRwbWx3RNX3jr3HoI483DKjezcHD6czvspcZSw-OJb3BZ-sMwklWT3N_cZVCl9a-KmThxDOk3-0Bdrubd9aExbW7YG2L0Bb__JbVfE_Xz9fk3798hV77bgL5hmDxT8-_4V68MGNXdB2QKDqtVWqsbfscbABjbVHPDu700G1hhcp2S8BOzVgy-j4bFTHPX7X4RCTLlJmj_5gXWCHauhxx9_Z3cjxE3dj4H6R9Y3oa1GrjJuizIvyTi7LOjs0slO7cieKoi1UISralV0h67LMq7pQrZCZbignUVAu80qUsl707V1O1OWSZF4WpYRlzielzcKYx1OcT6a9H7kpl0shsulW-emlRtSq7shDD2L1d3U3XdZ7IIo8ECt7DvqkX1Qs3Meg3GSuicFP7bj3sMyN9sFfZIIOhpsv2nvu8Zod_zjRiDT_bHSm-cFMHQ5ju-jsCWg7yaefT2dnH7gLQNupBw-0ndr4LwAA__8HP4nG">