ret i32 %C
}
+; FIXME: Value equivalence substitution is all-or-nothing, so needs a scalar compare.
+
define <2 x i8> @select_xor_icmp_vec_bad(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {
; CHECK-LABEL: @select_xor_icmp_vec_bad(
; CHECK-NEXT: [[A:%.*]] = icmp eq <2 x i8> [[X:%.*]], <i8 5, i8 3>
ret <2 x i8> %C
}
+; FIXME: Value equivalence substitution is all-or-nothing, so needs a scalar compare.
+
+define <2 x i32> @vec_select_no_equivalence(<2 x i32> %x) {
+; CHECK-LABEL: @vec_select_no_equivalence(
+; CHECK-NEXT: ret <2 x i32> [[X:%.*]]
+;
+ %x10 = shufflevector <2 x i32> %x, <2 x i32> undef, <2 x i32> <i32 1, i32 0>
+ %cond = icmp eq <2 x i32> %x, zeroinitializer
+ %s = select <2 x i1> %cond, <2 x i32> %x10, <2 x i32> %x
+ ret <2 x i32> %s
+}
+
; Folding this would only be legal if we sanitized undef to 0.
define <2 x i8> @select_xor_icmp_vec_undef(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {
; CHECK-LABEL: @select_xor_icmp_vec_undef(