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

    <tr>
        <th>Summary</th>
        <td>
            `load` wrongly replaced to `trunc (bitcast ...)` by GVN
        </td>
    </tr>

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

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

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

<pre>
    alive2 report: https://alive2.llvm.org/ce/z/-RsHE_

```ll
----------------------------------------
define i64 @fun0(ptr %val0, ptr %val1, ptr %val2, i1 %val3) {
entry:
  br i1 %val3, label %then, label %else

else:
  br label %exit

then:
  %val4 = load <4 x i32>, ptr %val1, align 16
 %val5 = load <4 x i32>, ptr %val1, align 16
  %val7 = select i1 0, ptr %val0, ptr %val1
  br label %exit

exit:
  %val8 = phi ptr [ %val7, %then ], [ null, %else ]
  %val9 = load i64, ptr %val8, align 4
 ret i64 %val9
}
=>
define i64 @fun0(ptr %val0, ptr %val1, ptr %val2, i1 %val3) {
entry:
  br i1 %val3, label %then, label %else

else:
  %val9.pre = load i64, ptr null, align 4
  br label %exit

then:
  %val4 = load <4 x i32>, ptr %val1, align 16
  %#0 = bitcast <4 x i32> %val4 to i128
  %#1 = trunc i128 %#0 to i64
  br label %exit

exit:
  %val9 = phi i64 [ %#1, %then ], [ %val9.pre, %else ]
  ret i64 %val9
}
Transformation doesn't verify!

ERROR: Target is more poisonous than source

Example:
ptr %val0 = null / Address=#x00
ptr %val1 = pointer(non-local, block_id=2, offset=0) / Address=#x40
ptr %val2 = null / Address=#x00
i1 %val3 = #x1 (1)

Source:
  >> Jump to %then
<4 x i32> %val4 = < #x00000000 (0), #x00000000 (0), poison, #x00000000 (0) >
<4 x i32> %val5 = < #x00000000 (0), #x00000000 (0), poison, #x00000000 (0) >
ptr %val7 = pointer(non-local, block_id=2, offset=0) / Address=#x40
  >> Jump to %exit
ptr %val8 = pointer(non-local, block_id=2, offset=0) / Address=#x40
i64 %val9 = #x0000000000000000 (0)

SOURCE MEMORY STATE
===================
NON-LOCAL BLOCKS:
Block 0 >    size: 0 align: 4        alloc type: 0   alive: false    address: 0
Contents:
*: #x00000000

Block 1 >    size: 1 align: 1        alloc type: 0   alive: true     address: 9
Contents:
*: #x00000000

Block 2 >    size: 19        align: 1        alloc type: 0   alive: true     address: 64
Contents:
if (and (= idx #b000000) (not (= idx #b000010)) (not (= idx #b000011)))
  #x00000000
else
  if (and (= idx #b000010) (not (= idx #b000011)))
    null, byte offset=0
 else
    if (or (and (not (= idx #b000000)) (not (= idx #b000010)) (not (= idx #b000011)))
    (= idx #b000011))
      #x00000000
    else
 poison

Block 3 >    size: 8 align: 1        alloc type: 0   alive: true     address: 1
Contents:
*: #x00000000


Target:
  >> Jump to %then
<4 x i32> %val4 = < #x00000000 (0), #x00000000 (0), poison, #x00000000 (0) >
i128 %#0 = poison
i64 %#1 = poison
  >> Jump to %exit
i64 %val9 = poison
Source value: #x0000000000000000 (0)
Target value: poison

Summary:
  0 correct transformations
  1 incorrect transformations
  0 failed-to-prove transformations
  0 Alive2 errors
```


`%val4` is loaded as  `<4 x i32>` and then loaded again as `i64`.
This second `load` is replaced by `trunc i64 (bitcast <4 x i32> %val4 to i128)`.

But if an element of the vector is `poison`, the result of `trunc (bitcast ...)` is `poison` in `tgt, while the result is just concatenation of the first two elements in `src`.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUWN1u27gSfhr6ZhCDomRZuvCF459zcE7bAEl2gb0qKIm22aVJg6ScuE-_ICnLku24QYoudoUgBjnDmW-G35AjUWP4WjI2QaN7NJoPaG03Sk8KJb_Vkg0KVR0mVPA9I6DZTmmL4ilsrN0ZFE8RWSKyDOKhEPvtUOk1IsuSIbL8jsjy7tH8d_EV4TnC0-Z_isOfEGHi7p1P0K7YiksGPE0AJXhVS4xItrMaEBntqcCIzOA0jPpD4oY8akYxIjmg8X0wzKTVBxeSHwEUuqc5A0ELJtyE3TDZm2DCsG6IftyzdFJ95bar6m2dVIO7BFA8B6FoBSieJfAKPCYoXlyJjQq-lhCljYEgGX14fSMaewOGCVZal4WzrF4k-R2B-vF5oJn3s9vwYG10f_TvHDSZBjSa--HoHmQtRCNyOfainsH8FDlPkz7M7BRv0qzSzAYmhcUN3nFjFMVzl7R_K-2aoIY7za5m5ZjMfkr-TrY6ESIx9gYKbktqbN9G68Iq4BHJ-gsjv9DqWpZe2tpz2um7IrpKy7ylpd_vQEvn7w1adjL9BjtvE-1ZU2lWSm-p5UpCpZiRiIwt7JnmqwMiURfy4vHx4dEdws9Ur51dA1ulGewUN0qq2oDdUAlG1brs8WPxSrc7caJIh74-YEcIQGQJ06rSzBjHfxK_YnyuHvK-U1xaphHJpJJ3QpXU06kQqvzzK69QPPe8V6uVYRbFc-x5f2E-uTBP3oPmVCRe24ncTBYhkneDfgpp6GxxvHDE-l-93TmeHAurqfhr3PP24xkE9-FxrlxAYb-vz4cNeUsD2rPlmtfRL_d6yvf4V2zntUSfiq9zKv8K551Sa9mBz542Z12yPPz2OFvA58Xnh8c_4Ol5-rzoXAUf-vPLvzx8ufv0MJt-gvtPD7P_P7V0vHcBAg67khv-3TEVMMK5PyrdIPEDoUqwh11XvPeDFfW3QE6PifByZ3umpGXSmtYZIlMn7iajG3zAEp1hibpYottYrK7PoOQ_A4WcQ8l_CsvxQrgAw1eOC1RW7sfRhVevDlrRAPNUy6Sy1-RRqLubKlFQackGVwI_XeYANwFFPwJ06Q3au744WNatoqDQ9X30rnQHwxuu8Dti_1B64KZeq3Qtj262E09zGl5wKz7jVvZT1Io-RvPm9vfX-D_6huo1V8153aa1OWzbfqwru30LnB_T3ZXh3oY9FTU7z-H1I7xph9oVl1v_VG-3tNdtYyiV1u4tx_Z6MHNUiIDLH6hgWFEuWHVn1d1Oqz17W3Ea3qOZ1kqbs9fhS2K4ybDBKMWuzXM9NquAGgAn6zXbKQZXrL41PeqtKZdOG6XYtcMpHjaZ2nADhpXKVXeKnXrjQbOdoCWroDg4SdNa-23K3tegk_zkpym42rozhUpggm2ZtKBWDifsWWmVdm5RipvdSv2blJNqZmrhdVsgHRDD4TC4Ol8OXPoFa-sMvWy4YF1z3MC32lgolSypZTJ03A2gFdfGgn1RR6SmsWZ06aIaVJO4yuOcDtgkGpMoyqMsiwebSbVKk7zIkjTJiphGVZEWaY5HaTHKx-U4xQM-IZgkeByNcTKKSDwsaFLSMqUpK1Y5TghKMNtSLtqPKANuTM0meU7SbOBfX4z_QkOIZC_ghYgQNJoP9MStuSvqtUEJFtxYc7JiuRVs0tnkF63kWhxOO-2K8maCiwP85_cvg1qLSf-zz5rbTV0MS7VFZOk8Nj-uCr6x0iKy9DgNIssQx35C_goAAP__2lP1Ew">