<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">