-
Notifications
You must be signed in to change notification settings - Fork 15.4k
Description
| Bugzilla Link | 47696 |
| Resolution | FIXED |
| Resolved on | Oct 23, 2020 18:33 |
| Version | trunk |
| OS | All |
| Blocks | #47292 |
| CC | @RKSimon,@nikic,@regehr,@rotateright |
| Fixed by commit(s) | 9d1c8c0 |
Extended Description
Test: Transforms/InstCombine/select-binop-cmp.ll
Seems to be a regression from https://reviews.llvm.org/D87480
The undef operand in the icmp needs to be fixed to 0 for the transformation to be correct. See here: https://alive2.llvm.org/ce/z/YYhL33
define <2 x i8> @select_xor_icmp_vec_undef(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {
%A = icmp eq <2 x i8> %x, { 0, undef }
%B = xor <2 x i8> %x, %z
%C = select <2 x i1> %A, <2 x i8> %B, <2 x i8> %y
ret <2 x i8> %C
}
=>
define <2 x i8> @select_xor_icmp_vec_undef(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {
%A = icmp eq <2 x i8> %x, { 0, undef }
%C = select <2 x i1> %A, <2 x i8> %z, <2 x i8> %y
ret <2 x i8> %C
}
Transformation doesn't verify!
ERROR: Target's return value is more undefined
Example:
<2 x i8> %x = < poison, #x01 (1) >
<2 x i8> %y = < poison, #x00 (0) >
<2 x i8> %z = < poison, #x01 (1) >
Source:
<2 x i1> %A = < poison, any >
<2 x i8> %B = < poison, #x00 (0) >
<2 x i8> %C = < poison, #x00 (0) >
Target:
<2 x i1> %A = < poison, #x1 (1) >
<2 x i8> %C = < poison, #x01 (1) >
Source value: < poison, #x00 (0) >
Target value: < poison, #x01 (1) >