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