diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp index 5c5d7f695fa35..01ca0894ac357 100644 --- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp +++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp @@ -926,13 +926,17 @@ InstCombinerImpl::foldBinOpOfSelectAndCastOfSelectCondition(BinaryOperator &I) { // If the value used in the zext/sext is the select condition, or the negated // of the select condition, the binop can be simplified. - if (CondVal == A) - return SelectInst::Create(CondVal, NewFoldedConst(false, TrueVal), + if (CondVal == A) { + Value *NewTrueVal = NewFoldedConst(false, TrueVal); + return SelectInst::Create(CondVal, NewTrueVal, NewFoldedConst(true, FalseVal)); + } - if (match(A, m_Not(m_Specific(CondVal)))) - return SelectInst::Create(CondVal, NewFoldedConst(true, TrueVal), + if (match(A, m_Not(m_Specific(CondVal)))) { + Value *NewTrueVal = NewFoldedConst(true, TrueVal); + return SelectInst::Create(CondVal, NewTrueVal, NewFoldedConst(false, FalseVal)); + } return nullptr; } diff --git a/llvm/test/Transforms/InstCombine/binop-select-cast-of-select-cond.ll b/llvm/test/Transforms/InstCombine/binop-select-cast-of-select-cond.ll index 0c859e5c09208..eaec15b167245 100644 --- a/llvm/test/Transforms/InstCombine/binop-select-cast-of-select-cond.ll +++ b/llvm/test/Transforms/InstCombine/binop-select-cast-of-select-cond.ll @@ -187,8 +187,8 @@ define i64 @select_non_const_sides(i1 %c, i64 %arg1, i64 %arg2) { define i6 @sub_select_sext_op_swapped_non_const_args(i1 %c, i6 %argT, i6 %argF) { ; CHECK-LABEL: define i6 @sub_select_sext_op_swapped_non_const_args ; CHECK-SAME: (i1 [[C:%.*]], i6 [[ARGT:%.*]], i6 [[ARGF:%.*]]) { -; CHECK-DAG: [[TMP1:%.*]] = xor i6 [[ARGT]], -1 -; CHECK-DAG: [[TMP2:%.*]] = sub i6 0, [[ARGF]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i6 [[ARGT]], -1 +; CHECK-NEXT: [[TMP2:%.*]] = sub i6 0, [[ARGF]] ; CHECK-NEXT: [[SUB:%.*]] = select i1 [[C]], i6 [[TMP1]], i6 [[TMP2]] ; CHECK-NEXT: ret i6 [[SUB]] ; @@ -201,8 +201,8 @@ define i6 @sub_select_sext_op_swapped_non_const_args(i1 %c, i6 %argT, i6 %argF) define i6 @sub_select_zext_op_swapped_non_const_args(i1 %c, i6 %argT, i6 %argF) { ; CHECK-LABEL: define i6 @sub_select_zext_op_swapped_non_const_args ; CHECK-SAME: (i1 [[C:%.*]], i6 [[ARGT:%.*]], i6 [[ARGF:%.*]]) { -; CHECK-DAG: [[TMP1:%.*]] = sub i6 1, [[ARGT]] -; CHECK-DAG: [[TMP2:%.*]] = sub i6 0, [[ARGF]] +; CHECK-NEXT: [[TMP1:%.*]] = sub i6 1, [[ARGT]] +; CHECK-NEXT: [[TMP2:%.*]] = sub i6 0, [[ARGF]] ; CHECK-NEXT: [[SUB:%.*]] = select i1 [[C]], i6 [[TMP1]], i6 [[TMP2]] ; CHECK-NEXT: ret i6 [[SUB]] ;