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 @@ -3996,6 +3996,15 @@ return FalseVal; } + // select i1 Cond, i1 true, i1 false --> i1 Cond + assert(Cond->getType()->isIntOrIntVectorTy(1) && + "Select must have bool or bool vector condition"); + assert(TrueVal->getType() == FalseVal->getType() && + "Select must have same types for true/false ops"); + if (Cond->getType() == TrueVal->getType() && + match(TrueVal, m_One()) && match(FalseVal, m_ZeroInt())) + return Cond; + // select ?, X, X -> X if (TrueVal == FalseVal) return TrueVal; diff --git a/llvm/test/Transforms/InstSimplify/select.ll b/llvm/test/Transforms/InstSimplify/select.ll --- a/llvm/test/Transforms/InstSimplify/select.ll +++ b/llvm/test/Transforms/InstSimplify/select.ll @@ -3,8 +3,7 @@ define i1 @bool_true_or_false(i1 %cond) { ; CHECK-LABEL: @bool_true_or_false( -; CHECK-NEXT: [[S:%.*]] = select i1 [[COND:%.*]], i1 true, i1 false -; CHECK-NEXT: ret i1 [[S]] +; CHECK-NEXT: ret i1 [[COND:%.*]] ; %s = select i1 %cond, i1 true, i1 false ret i1 %s @@ -12,8 +11,7 @@ define <2 x i1> @bool_true_or_false_vec(<2 x i1> %cond) { ; CHECK-LABEL: @bool_true_or_false_vec( -; CHECK-NEXT: [[S:%.*]] = select <2 x i1> [[COND:%.*]], <2 x i1> , <2 x i1> zeroinitializer -; CHECK-NEXT: ret <2 x i1> [[S]] +; CHECK-NEXT: ret <2 x i1> [[COND:%.*]] ; %s = select <2 x i1> %cond, <2 x i1> , <2 x i1> zeroinitializer ret <2 x i1> %s @@ -21,8 +19,7 @@ define <2 x i1> @bool_true_or_false_vec_undef(<2 x i1> %cond) { ; CHECK-LABEL: @bool_true_or_false_vec_undef( -; CHECK-NEXT: [[S:%.*]] = select <2 x i1> [[COND:%.*]], <2 x i1> , <2 x i1> -; CHECK-NEXT: ret <2 x i1> [[S]] +; CHECK-NEXT: ret <2 x i1> [[COND:%.*]] ; %s = select <2 x i1> %cond, <2 x i1> , <2 x i1> ret <2 x i1> %s