diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp index e5525133e5dbb..245fecb775e8c 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp @@ -1348,7 +1348,7 @@ Instruction *InstCombinerImpl::foldSelectValueEquivalence(SelectInst &Sel, // If we will be able to evaluate f(Y) to a constant, we can allow undef, // otherwise Y cannot be undef as we might pick different values for undef // in the cmp and in f(Y). - if (TrueVal == OldOp) + if (TrueVal == OldOp && (isa(OldOp) || !isa(NewOp))) return nullptr; if (Value *V = simplifyWithOpReplaced(TrueVal, OldOp, NewOp, SQ, @@ -1925,17 +1925,6 @@ Instruction *InstCombinerImpl::foldSelectInstWithICmp(SelectInst &SI, ICmpInst::Predicate Pred = ICI->getPredicate(); Value *CmpLHS = ICI->getOperand(0); Value *CmpRHS = ICI->getOperand(1); - if (CmpRHS != CmpLHS && isa(CmpRHS) && !isa(CmpLHS)) { - if (CmpLHS == TrueVal && Pred == ICmpInst::ICMP_EQ) { - // Transform (X == C) ? X : Y -> (X == C) ? C : Y - replaceOperand(SI, 1, CmpRHS); - Changed = true; - } else if (CmpLHS == FalseVal && Pred == ICmpInst::ICMP_NE) { - // Transform (X != C) ? Y : X -> (X != C) ? Y : C - replaceOperand(SI, 2, CmpRHS); - Changed = true; - } - } if (Instruction *NewSel = foldSelectICmpEq(SI, ICI, *this)) return NewSel; diff --git a/llvm/test/Transforms/InstCombine/select-value-equivalence.ll b/llvm/test/Transforms/InstCombine/select-value-equivalence.ll index d55766ddf4040..812b4d8f6be79 100644 --- a/llvm/test/Transforms/InstCombine/select-value-equivalence.ll +++ b/llvm/test/Transforms/InstCombine/select-value-equivalence.ll @@ -322,12 +322,11 @@ define <2 x i8> @select_vec_op_const_no_undef(<2 x i8> %x) { ret <2 x i8> %xr } -; FIXME: This is a miscompile. define <2 x i8> @select_vec_op_const_undef(<2 x i8> %x) { ; CHECK-LABEL: define <2 x i8> @select_vec_op_const_undef( ; CHECK-SAME: <2 x i8> [[X:%.*]]) { ; CHECK-NEXT: [[XZ:%.*]] = icmp eq <2 x i8> [[X]], -; CHECK-NEXT: [[XR:%.*]] = select <2 x i1> [[XZ]], <2 x i8> , <2 x i8> +; CHECK-NEXT: [[XR:%.*]] = select <2 x i1> [[XZ]], <2 x i8> [[X]], <2 x i8> ; CHECK-NEXT: ret <2 x i8> [[XR]] ; %xz = icmp eq <2 x i8> %x,