Index: lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp =================================================================== --- lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp +++ lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp @@ -326,6 +326,16 @@ DemandedMask.countTrailingZeros() + 1 > C->getBitWidth() - C->countLeadingZeros()) return LHS; + } else if (SPF == SPF_UMIN) { + // UMin(A, C) == A if ... + // The lowest non-zero bit of DemandMask is higher than the highest + // non-one bit of C + // This comes about from some maths on the above umax example + const APInt *C; + if (match(RHS, m_APInt(C)) && + DemandedMask.countTrailingZeros() + 1 > + C->getBitWidth() - C->countLeadingOnes()) + return LHS; } // If this is a select as part of any other min/max pattern, don't simplify Index: test/Transforms/InstCombine/minmax-demandbits.ll =================================================================== --- test/Transforms/InstCombine/minmax-demandbits.ll +++ test/Transforms/InstCombine/minmax-demandbits.ll @@ -190,9 +190,7 @@ define i8 @or_min_31_30(i8 %A) { ; CHECK-LABEL: @or_min_31_30( -; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[A:%.*]], -30 -; CHECK-NEXT: [[MIN:%.*]] = select i1 [[CMP]], i8 [[A]], i8 -30 -; CHECK-NEXT: [[R:%.*]] = or i8 [[MIN]], 31 +; CHECK-NEXT: [[R:%.*]] = or i8 [[A:%.*]], 31 ; CHECK-NEXT: ret i8 [[R]] ; %cmp = icmp ult i8 %A, -30 @@ -203,9 +201,7 @@ define i8 @or_min_7_6(i8 %A) { ; CHECK-LABEL: @or_min_7_6( -; CHECK-NEXT: [[L2:%.*]] = icmp ult i8 [[A:%.*]], -6 -; CHECK-NEXT: [[MIN:%.*]] = select i1 [[L2]], i8 [[A]], i8 -6 -; CHECK-NEXT: [[R:%.*]] = or i8 [[MIN]], 7 +; CHECK-NEXT: [[R:%.*]] = or i8 [[A:%.*]], 7 ; CHECK-NEXT: ret i8 [[R]] ; %l2 = icmp ult i8 %A, -6 @@ -216,9 +212,7 @@ define i8 @or_min_7_5(i8 %A) { ; CHECK-LABEL: @or_min_7_5( -; CHECK-NEXT: [[L2:%.*]] = icmp ult i8 [[A:%.*]], -5 -; CHECK-NEXT: [[MIN:%.*]] = select i1 [[L2]], i8 [[A]], i8 -5 -; CHECK-NEXT: [[R:%.*]] = or i8 [[MIN]], 7 +; CHECK-NEXT: [[R:%.*]] = or i8 [[A:%.*]], 7 ; CHECK-NEXT: ret i8 [[R]] ; %l2 = icmp ult i8 %A, -5