diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -82,6 +82,14 @@ else return nullptr; + // %C = or %FV, %TV + // %D = select %C, %TV, %FV + // --> + // %TV + if (BinOpCode == BinaryOperator::Or && + match(Cond, m_LogicalOr(m_Specific(FalseVal), m_Specific(TrueVal)))) + return TrueVal; + CmpInst::Predicate ExpectedPred, Pred1, Pred2; if (BinOpCode == BinaryOperator::Or) { ExpectedPred = ICmpInst::ICMP_NE; diff --git a/llvm/test/Transforms/InstSimplify/select-or-cmp.ll b/llvm/test/Transforms/InstSimplify/select-or-cmp.ll --- a/llvm/test/Transforms/InstSimplify/select-or-cmp.ll +++ b/llvm/test/Transforms/InstSimplify/select-or-cmp.ll @@ -337,3 +337,21 @@ %D = select i1 %C, i32 %x, i32 %k ret i32 %D } + +define i1 @select_or_return_true(i1 %x, i1 %y) { +; CHECK-LABEL: @select_or_return_true( +; CHECK-NEXT: ret i1 [[Y:%.*]] +; + %C = or i1 %x, %y + %D = select i1 %C, i1 %y, i1 %x + ret i1 %D +} + +define <2 x i1> @select_or_return_true1(<2 x i1> %x, <2 x i1> %y) { +; CHECK-LABEL: @select_or_return_true1( +; CHECK-NEXT: ret <2 x i1> [[Y:%.*]] +; + %C = or <2 x i1> %x, %y + %D = select <2 x i1> %C, <2 x i1> %y, <2 x i1> %x + ret <2 x i1> %D +}