<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/57811>57811</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[X86] Promote i32 CTTZ (BSF) instructions and remove speculation branch
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:X86
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
RKSimon
</td>
</tr>
</table>
<pre>
Extends https://reviews.llvm.org/D132520 which did the same for i8/i16 cases.
Related to Issue #57810 - on some x64 targets without BMI, we'd be better off performing CTTZ (with zero handling) as a BTS + (REP) BSR BSFq. Atom/Silvermont in particular would benefit from avoiding a i64 immediate, but anything with a fastish BTS as well.
```
auto ctz32(uint32_t x) {
return x ? __builtin_ctz(x) : 32;
}
auto ctz32_64(uint64_t x) {
return __builtin_ctzll(x | (1ULL << 32));
}
```
Current Codegen:
```
ctz32(unsigned int): # @ctz32(unsigned int)
testl %edi, %edi
je .LBB0_2
rep bsfl %edi, %eax
retq
.LBB0_2: # %cond.end
movl $32, %eax
retq
ctz32_64(unsigned long): # @ctz32_64(unsigned long)
movabsq $4294967296, %rax # imm = 0x100000000
orq %rdi, %rax
rep bsfq %rax, %rax
retq
```
Could be:
```
ctz32_64(unsigned long): # @ctz32_64(unsigned long)
btsq $32, %rdi
rep bsfq %rdi, %rax
retq
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy9VVuPmzoQ_jXwMmoEhnB54CGXrlR1K1W7W-novEQGJsGtwYltkrS_vmPCpkm2u_tWywFiz-Wbb-yZUtU_i49Hi11toLF2a7xo5rE7mhr3Ag9mIuW-nSi9oaVlGLEpC-DQiKqBWtRgGwTDW4S10iAykhFhAhU3aCbgBUsvmJ2eDyi5RVJQ8MmYHsFj0TTNwgA-gOrAKLJxTGKwXG_QGjgI26jewvzLJ48t4IAeS2sokaa1qEGt17BFTW5b0W1g8fT0P5nMnBr8Qq2g4V0tactjOXADHOZPjyQxd1IPH7-65fnjA_3udhOYWdUS9kch96hb1VkQHWy5tqLqJddwUL103jtcCwtrrVrgeyVq55qDINyibbEWFKJDWxJw3v20jdsfIHFYc2OFaQYYhOeAUk5GgpJgnMNf3hNHlf0VMULai85GbGXh6AB76fwkAzQ02l53cAQvuoPVquyFtKJbkSbpncSjGZCVaFTy0uWth1USj06S-C0nV-aldA5IbuG4DL_d35OnBU3njOVuvnB5E-Oi1xqJ5YWqcYOdO3N_Ezuz0Bmx6ej0ENDB_IDt9UFnC7w4eE39HJ0bFo2Vg86UEuiyN35dSX3H03tyP58HK3a9qXELpVnLP-4vTfHjrbTdnVaejb0XzhgQm1aqqyd0Va8NtmovT0KxC_c9r5eJfyZGquGivI3kktVX9G9x8dLsHK6Y5XGepCxPRnyaH_9inS4RHaUlBMcwGMe1SaV3zwzrM8P6ZaxDPnYX-XAyr0o_M3N7SMdL_-bp_BdEltbsbhOsb0_oZdDv0fMiYB-LMEmiOM-nOfPrIqrzKOe-FVZi4U3n_2WJN13CVyp8yiKIiJ0rLhVQVzVEZ6zuKytUR8W2q8kL5Z-awxZdCXXrUGreVY3fa1lct5oNlci-nFRDEXb9Znx92Gr1HSvr2oprGoY-XNMI_abIaqw4ppisqzjn6zzL0gixDJK6ysoyzH3JS5TGofcYK3n1w12caOZCYYyi8UXBAsaCPCSDYRSGk7jO6iybpiFLeZhGIeUIWy7kuQX6uhhglf3G0KYUxv7pjz43QxIHwpx9KrON0sXD50dBLcUfIigG-L8BDmgNiA">