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