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) > https://web.ist.utl.pt/nuno.lopes/alive2/index.php?hash=1546033e6d866cfc&test=Transforms%2FInstCombine%2Fselect-binop-cmp.ll
Probably should block this transform if the icmp operand is not guaranteed-not-undef.
Should be fixed by https://github.com/llvm/llvm-project/commit/9d1c8c0ba94a273c53829f0800335045e547db88.