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

    <tr>
        <th>Summary</th>
        <td>
            SLP vectorizer's reduce_and formation introduces poison
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            miscompilation,
            llvm:SLPVectorizer
      </td>
    </tr>

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

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

<pre>
    Reduced test case from `SLPVectorizer/X86/reduction-logical.ll`'s `logical_and_icmp_clamp_extra_use_select`:
```llvm
define i1 @src(i32 %x3, i1 %d2) {
  %c2 = icmp slt i32 0, 0
  %c3 = icmp slt i32 %x3, 0
  %d0 = icmp sgt i32 1, 0
  %d1 = icmp sgt i32 1, 0
  %d22 = icmp sgt i32 1, 0
  %d3 = icmp sgt i32 1, 0
  %s2 = select i1 false, i1 false, i1 false
  %s3 = select i1 %s2, i1 %c3, i1 false
  %s4 = select i1 %s3, i1 %d0, i1 false
  %s5 = select i1 %s4, i1 %d1, i1 false
  %s6 = select i1 %s5, i1 %d2, i1 false
  %s7 = select i1 %s6, i1 %d3, i1 false
  ret i1 %s7
}
```

Alive2's output, showing that the SLP vectorizer changes the return value to poison because it flips the order of selects:
```llvm
define i1 @src(i32 %x3, i1 %d2) {
%0:
  %c2 = icmp slt i32 0, 0
  %c3 = icmp slt i32 %x3, 0
  %d0 = icmp sgt i32 1, 0
  %d1 = icmp sgt i32 1, 0
  %d22 = icmp sgt i32 1, 0
  %d3 = icmp sgt i32 1, 0
  %s2 = select i1 0, i1 0, i1 0
  %s3 = select i1 %s2, i1 %c3, i1 0
  %s4 = select i1 %s3, i1 %d0, i1 0
  %s5 = select i1 %s4, i1 %d1, i1 0
  %s6 = select i1 %s5, i1 %d2, i1 0
  %s7 = select i1 %s6, i1 %d3, i1 0
  ret i1 %s7
}
=>
define i1 @src(i32 %x3, i1 %d2) {
%0:
  %c2 = icmp slt i32 0, 0
  %1 = insertelement <4 x i32> { 0, 0, 0, poison }, i32 %x3, i32 3
  %2 = icmp sgt <4 x i32> { 1, 1, 1, 0 }, %1
  %d22 = icmp sgt i32 1, 0
  %s2 = select i1 0, i1 0, i1 0
  %3 = freeze <4 x i1> %2
  %4 = reduce_and <4 x i1> %3
  %op.rdx = select i1 %d2, i1 %s2, i1 0
  %op.rdx1 = select i1 %4, i1 %op.rdx, i1 0
  ret i1 %op.rdx1
}
Transformation doesn't verify!
ERROR: Target is more poisonous than source

Example:
i32 %x3 = poison
i1 %d2 = poison

Source:
i1 %c2 = #x0 (0)
i1 %c3 = poison
i1 %d0 = #x1 (1)
i1 %d1 = #x1 (1)
i1 %d22 = #x1 (1)
i1 %d3 = #x1 (1)
i1 %s2 = #x0 (0)
i1 %s3 = #x0 (0)
i1 %s4 = #x0 (0)
i1 %s5 = #x0 (0)
i1 %s6 = #x0 (0)
i1 %s7 = #x0 (0)

Target:
i1 %c2 = #x0 (0)
<4 x i32> %1 = < #x00000000 (0), #x00000000 (0), #x00000000 (0), poison >
<4 x i1> %2 = < #x1 (1), #x1 (1), #x1 (1), poison >
i1 %d22 = #x1 (1)
i1 %s2 = #x0 (0)
<4 x i1> %3 = < #x1 (1), #x1 (1), #x1 (1), #x1 (1) >
i1 %4 = #x1 (1)
i1 %op.rdx = poison
i1 %op.rdx1 = poison
Source value: #x0 (0)
Target value: poison
```

cc @regehr @alexey-bataev @cilkplus @davemgreen @RKSimon
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzlV0GP6jYQ_jXhYi1ybJLAgcO-x-6llVrtPlW9IeNMglsnjmyHsu_X105CCAQeLK16KUKOPTPfeGx_M3E2Kv1YvkFac0iRBWMRZwZQplWBghi___zrb8Ct0uI76IC8_j6PXau9vRWqfJIqF5zJqZTOOCCJ8aBOuGZluha8qNZcMtfC3mq2rg2sDUjn1CPoc4BXAX72_eYv5a5oRSlkogQkQhTMsNE8IHNBCQpItKcB-dooSJSSgCxQkHxpQcjLuLOiK-SnRkZa5GHYQ_DQiI6Net9DwxQPDPPWMBwZhfcYEXKPFb3DyLSe2o30W5ExaaDblnF_AKRnwMbZcT85vQacXQAODwJfA0YXgLMBMLwGjC8Ao9OjvwxMLgDjAfDiGjX0tklHymR1xs5u2LTPUuyANJxXta1q652arfpLlDmyW2ZdA8glENr1GYT4lpU5mEblJqx1iXZM1oCsQpUSRpVoA5y5JEHCokyKqrVVOnVolXWLMv964jjJMRv_t1l04PDx-UDm4EeyBj-SMfiRbMGPZAq-J0voKqAv_z0HO9KUBrR1CymgtE7ydYb23t6F5Gc4wA5Nl2w-eB_OSWxuQAf-z-g2dt0cx7HBB68-tk8T91OcbCmZaYDv0AcWNnG5uAeGLQ2b9zb49_LIeLhgVU11uh8zIx2w3VyiUwsMx8gBeVub67TqfJxx65tmpcmULpi_dqBUgSld6bWutmqRfQSkA7y8vf3y5jiEvjGde58GFUpDd9yq9tWUlcioWnMYVvOXvbuiSOjp1zOiWUwL7zTdXowUbfveuu79hAMeB4TuHTvI3J3l4kR_dRrcA_14Hp4Bu4p5XU_IDQP6Y725EbmhN_SzG_rohj6-oU-u6TviNDy4-zjOkvtQXJy4te5-PYh8Xn6oPIdSOUrbkxmPh0LuEZw7v5MF1095VCf-SXQngvMgZz8OcVCUxmkyLDxDbZuM7RXLV4ULC-wKRW9yktGX7n2c-3eahhy22veYhD18PG2YZbDzAi7kn5V0pcb1U7aDInf1ufSjt5_eRaHKSbqk6YIu2MQKK2F5ekdsbpSDSn2seqK0Wnm56aKc1Fout9ZWzX2QvLp_Luy23ky5KtyguRO2j6dKqz_8Rxd5FcbUYFwnihI6m2yXJEqSmM1xvIBwFsUZTuKY85i5T8JNGLH5RLINSLMMoi8BIYUwznslZBOUE7QnS5rJ6PPZFyMJotVELAkmBEckCWk4x3TKcMLZIgTMsnTOI-72Bgom_HfkrpgqnU_0sol6U-fGKaUw1hyVzBiRlwBNRM4_q-1W6WVZl6qSqgIzada4bBb4N9Ym2eY">