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

    <tr>
        <th>Summary</th>
        <td>
            [InstCombine] wrong folding of `shufflevector` with a binary operator
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          bongjunj
      </td>
    </tr>
</table>

<pre>
    https://github.com/llvm/llvm-project/blob/6effab990c5c1b4fe55fcd43004a1fd88145bb8d/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp#L2228-L2240

Alive2 report: https://alive2.llvm.org/ce/z/FA_YTY

```llvm
----------------------------------------
define <2 x i16> @test_srem_orig.2(i16 %a, i1 %cmp) {
#0:
  %splatinsert = insertelement <2 x i16> { 65535, poison }, i16 %a, i32 0
  %splat = shufflevector <2 x i16> %splatinsert, <2 x i16> undef, 0, 0
  %t1 = select i1 %cmp, <2 x i16> { 65535, poison }, <2 x i16> %splat
  %#1 = xor <2 x i16> %t1, { 2, 2 }
  ret <2 x i16> %#1
}
=>
define <2 x i16> @test_srem_orig.2(i16 %a, i1 %cmp) {
#0:
  %splatinsert = insertelement <2 x i16> poison, i16 %a, i64 0
  %#1 = xor <2 x i16> %splatinsert, { 2, poison }
  %#2 = shufflevector <2 x i16> %#1, <2 x i16> poison, 0, 0
 %#3 = select i1 %cmp, <2 x i16> { 65533, poison }, <2 x i16> %#2
  ret <2 x i16> %#3
}
Transformation doesn't verify!

ERROR: Target's return value is more undefined

Example:
i16 %a = #x0000 (0)
i1 %cmp = undef

Source:
<2 x i16> %splatinsert = < #x0000 (0), poison >
<2 x i16> %splat = < #x0000 (0), #x0000 (0) >
<2 x i16> %t1 = < #x0000 (0)   [based on undef value], #x0000 (0) >
<2 x i16> %#1 = < #x0002 (2), #x0002 (2) >

Target:
<2 x i16> %splatinsert = < #x0000 (0), poison >
<2 x i16> %#1 = < #x0002 (2), poison >
<2 x i16> %#2 = < #x0002 (2), #x0002 (2) >
<2 x i16> %#3 = < #x0002 (2), #x0002 (2) >
Source value: < #x0002 (2), #x0002 (2) >
Target value: < #x0002 (2), #x0002 (2) >


----------------------------------------
define <2 x i16> @test_srem_orig.3(i16 %a, i1 %cmp) {
#0:
  %splatinsert = insertelement <2 x i16> poison, i16 %a, i32 0
  %splat = shufflevector <2 x i16> %splatinsert, <2 x i16> poison, 0, 0
  %t1 = select i1 %cmp, <2 x i16> { undef, 65535 }, <2 x i16> %splat
  %t2 = srem <2 x i16> %t1, { 2, 2 }
  ret <2 x i16> %t2
}
=>
define <2 x i16> @test_srem_orig.3(i16 %a, i1 %cmp) {
#0:
  %splatinsert = insertelement <2 x i16> poison, i16 %a, i64 0
  %#1 = srem <2 x i16> %splatinsert, { 2, 1 }
  %#2 = shufflevector <2 x i16> %#1, <2 x i16> poison, 0, 0
  %t2 = select i1 %cmp, <2 x i16> { 0, 65535 }, <2 x i16> %#2
  ret <2 x i16> %t2
}
Transformation doesn't verify!

ERROR: Target's return value is more undefined

Example:
i16 %a = #x0001 (1)
i1 %cmp = undef

Source:
<2 x i16> %splatinsert = < #x0001 (1), poison >
<2 x i16> %splat = < #x0001 (1), #x0001 (1) >
<2 x i16> %t1 = < #x0001 (1)   [based on undef value], #x0001 (1) >
<2 x i16> %t2 = < #x0001 (1), #x0001 (1) >

Target:
<2 x i16> %splatinsert = < #x0001 (1), poison >
<2 x i16> %#1 = < #x0001 (1), poison >
<2 x i16> %#2 = < #x0001 (1), #x0001 (1) >
<2 x i16> %t2 = < #x0001 (1), #x0001 (1) >
Source value: < #x0001 (1), #x0001 (1) >
Target value: < #x0001 (1), #x0001 (1) >

Summary:
  0 correct transformations
  2 incorrect transformations
  0 failed-to-prove transformations
  0 Alive2 errors
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMWEFvozoQ_jWTi9XIjHEIhxzSZiM9aaUn7e5lT5UBk7gCG9kmbd-vfwKSFJI0Tdrt7lYVBTN8M55vPF81wjm10lLOgN8CX4xE7dfGzhKjVw-1fhglJnuerb2vHLA54BJwuVJ-XSfj1JSAy6LY7P7cVNY8yNQDLpPCJIDLicxzkcQxTXkaJGEuOc_TLGSUhiLIs-k0CHmSTLMejmq--2GFdrmxpQNc_qOdvzNlorTcPtk69croblHp1TitKkD2FRGnN18RQwp0AXTeXeeF2kgkVlbGemBzMtyNaF-PG_9jY1eAy7Tx8x_gcjm___njZx8LJrT7bcNtl24u_OmsM5krLQmwOyRPRAUTYF8IhNRL5--dleW9sWo1RsCpCiYEkAvAO6KC5jYtK8CYQHS7jQYZbfbRPpDGwlWF8Eo7aT0BtiDdrSxkKbU_9BrdkgnnjDcOKqOc0QSiReeu55ohoYcuWnC3rvO8kBuZemMPwQexNDjD97XOZN4s0-7ygu-DDlwWMvX9jR9CnIn_dCw9J4Csc_N0KnIftCDRLcHmBlvY7cdWHuWxg9tSsrMEtgD25a8jvcvTEceTcMDB-fQcErvLU4-DARReUi1tCo-oewl3UCedPbuyUNgFhdKE-xbV7IDqfbcSTVcimZFOA0aebKRV-TNg0G8hX759-_db04Z-CLuSHjByjafaarIRRS2JcqQ0VnZHRGmZDb5-EmVVyH0B7FhsUwHIniillABOKWC8M9lmprXpDl4P8bupbfoCeI7tzgm7O3bUS-yu6E8DnYU4XDsDtu0SJ5FoDPw2EU5mxOhuw11qgS-udLM_CD1H2HyHw5D3az2srjY6kj8_u29GegkCvnevp07JO7G6etwSxubvQOhy_hGE_vVT9J39uVb_KXL-Sp--Ws_3_xa0wn6xnPutxFhZ_gI19_hxLf-DBL-m5aez85qYB79Dx_vcXVQf9O3aeFPBj-j92_S7ScE0-A36_eLo3fo9gDhcu0q_e7u-TL8vcnOkaJcG_FH1vi63p9T7aoR37_WXZe2Mdl-IcEa7r2Lue12Wwj73mislqbG26TF-cN7dzgCJ0m-YUJILVcjsxpubypqNfN1wO3WQ1hrrDoYHo2zGspjFYiRnQcQo4zRk0Wg9C0UWRiIOMOFpzII4m6Y8EDSeZnnKcz4ZqRlSDAPKAhpyxqNxGrIskjSLs2wSxxFCSGUpVLGfZ4yUc7WcBUHIOB8VIpGFa2c9iFo-kvYtIAJfjOysneIk9cpBSAvlvHuB8coX7ZCoP47hC_JojV6R3BSZ0iticgITOpAImFDyqPyaCJIoLewzMZW0whs7qm1x_WipjdgBLrdb2szw_wAAAP__9-fYlw">