<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/166534>166534</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[X86] Unnecessary repeated costly comparisons in multiple blocks
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:X86,
missed-optimization,
llvm:SelectionDAG
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
RKSimon
</td>
</tr>
</table>
<pre>
CGP's sinkCmpExpression is duplicating a costly CmpInst in multiple blocks instead of just reusing the result
```cpp
using Word = unsigned _BitInt(128);
void doit(const Word &a, const Word &b, Word *p0, Word *p1) {
bool eq = a == b;
*p0++ |= Word((unsigned)eq);
if (eq) {
*p1++ |= Word((unsigned)eq);
}
}
```
```ll
define void @doit(ptr %a, ptr %b, ptr %p0, ptr %p1) {
entry:
%0 = load i128, ptr %a, align 8
%1 = load i128, ptr %b, align 8
%cmp = icmp eq i128 %0, %1
%conv1 = zext i1 %cmp to i128
%2 = load i128, ptr %p0, align 8
%or = or i128 %2, %conv1
store i128 %or, ptr %p0, align 8
br i1 %cmp, label %if.then, label %if.end
if.then:
%3 = load i128, ptr %p1, align 8
%or7 = or i128 %3, %conv1
store i128 %or7, ptr %p1, align 8
br label %if.end
if.end:
ret void
}
```
```asm
doit:
# %bb.0: # %entry
movq (%rdi), %rax
movq 8(%rdi), %r8
vmovdqu (%rdi), %xmm0
movq (%rsi), %r9
movq 8(%rsi), %rdi
vpxor (%rsi), %xmm0, %xmm0
xorl %esi, %esi
vptest %xmm0, %xmm0 ; FIRST COMPARISON
sete %sil
orq %rsi, (%rdx)
vptest %xmm0, %xmm0 ; SECOND COMPARISON - use TEST ESI,ESI?
jne .LBB0_2
# %bb.1: # %if.then
xorq %r9, %rax
xorq %rdi, %r8
xorl %edx, %edx
orq %rax, %r8 ; THIRD COMPARISON - ARGH!
sete %dl
orq %rdx, (%rcx)
.LBB0_2: # %if.end
retq
```
The third comparison in particular is annoying as we can no longer fold to a VPTEST as the i128 are split into i64 pairs.
It looks like some targets have already started overriding TLI::hasMultipleConditionRegisters to hack this - we might just want to do the same on x86.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyUVltv4joQ_jXmZVSUOATCAw9cyi46e1PpubytnHgAt44dbIel--uP7CRceqDSqargZGa--ebz-MKsFVuFOCHpjKSLHqvdTpvJ0x9rUWrVyzV_m8w__SB0ZMEK9Tovq8djZdBaoRUIC7yupCiYE2oLDAptnXyDeVmtlHUgFJS1dKKSCLnUxasFoaxDxkFv4KW2DgzW1se6HYJBW0tHoikZRs1_UVUkmjYef2vDgSQLqFXgzOHnTLiVcoRmMc0IHZNkRqLpQQsOXAv_vdCeRhNJh4zQOVx_yv2n9mVaRVdvMaFjICOPCQCQay0B94EC808_yJuc3t4CzAidARnNvdVDEU8t6zgTOsb9iaoPExsgNAsfL5J1gPH_BySjhZeweXZCXo6lJNGU40YohCAWGUStXpUzQGgahGrH-cW4Eah7udAHlTNvJJkGCoSmUVBJasZBhLk5RQVoJsVWQdZ5x3e98xveRVkFf-EHuA8hIaf39WgnR60ODfRvPDoQcRftdJOn9aN30zf1vsuvTfDX5pSZtplDQu9mnTZ4MmvzIWRuztS8TbIcpX8Xm77boXr_DRX3sxlNO_tZ9uR-JfHNSkbvS0nel_KfWkYfoubmLlc_bqgadKHxPm5TZkvfp74xQxihSWiJvB-R5LRI7v213k1jntdUqQ_7xpwRmhou_NJpSjbseMMxu-UZaj2U-sD39S2oY1lG95PaS6jxBzmvHLm48DxUR21uI4bcN2kctZENjRR9xLwb-WIqh9bBDQAAkswAlqun9TPMv3_9MX1arb9_u8C16LDFtcLvLaDNvp2Ehtv8JNLRE72s427akHX9OP_-bXGRFh6gtgjPj-tneFyvCJ37Z7K8wHxRgQ30v8xm0U961Tmx75z2tVs-VwLtO9q3u-LSg4urdrhU15c570bn6EtZ2PEU3Sr8_Hn19K7U6dOnz4Q2W8pZZC7vYHZpg9RFK3Unw1XhzbrsMAy6_btV-LxDcDthOBS6rJgR1h_3CipmnChqyYw__JlS-i2c_BZ-IRRMgdIgtdqigY2W3G-1DP76EeaL2XDKh62EGQRbSeHvCH47Hg6gYsLYfrNdrBxIrV8tSPGKYHWJ4JjZorOwYwcEJg0y_gbWMeOQgz6gMYJ7Ks9fVn6_SKY7Zr-2l4-5Vlw4odUTboV1aKwntmPFqy_SwoNnX4rtzjWXkl9MOe_BdWBsWYmgFRyzYb_HJwkfJ2PWw0k8GtJkENNx1ttNcJMOinyUFnk0KLLNeJRtBgkf8VFC4ygdY09MaETTOI7SOI4HadYvhsNBHA8LHGdRUiQpGURYMiH7Uh7KvjbbnrC2xkk8HKbJoBf2VRsuapTmrHhtNtR_siGh_gQilJbCWuQPunKiFL-Zr_hk86Akma5RYuENi-knb0sXPTPxtoe83loyiKSwzp4pOOFkuB36POkC_lQKC7SWmTcwWCHz8rfXvnOr2BtXv15t5GTnXGX9_NAlocutcLs67xe6JHQZCDY_D5XRL1g4QpdBAkvoslXhMKH_BgAA__9nhf2Z">