diff --git a/llvm/lib/Analysis/DemandedBits.cpp b/llvm/lib/Analysis/DemandedBits.cpp --- a/llvm/lib/Analysis/DemandedBits.cpp +++ b/llvm/lib/Analysis/DemandedBits.cpp @@ -170,6 +170,14 @@ } break; } + case Intrinsic::umax: + case Intrinsic::umin: + case Intrinsic::smax: + case Intrinsic::smin: + // If low bits of result are not demanded, they are also not demanded + // for the min/max operands. + AB = APInt::getBitsSetFrom(BitWidth, AOut.countTrailingZeros()); + break; } } break; diff --git a/llvm/test/Transforms/BDCE/intrinsics.ll b/llvm/test/Transforms/BDCE/intrinsics.ll --- a/llvm/test/Transforms/BDCE/intrinsics.ll +++ b/llvm/test/Transforms/BDCE/intrinsics.ll @@ -8,8 +8,8 @@ define i8 @umax(i8 %x, i8 %y, i1 %a, i1 %b) { ; CHECK-LABEL: @umax( -; CHECK-NEXT: [[A2:%.*]] = zext i1 [[A:%.*]] to i8 -; CHECK-NEXT: [[B2:%.*]] = zext i1 [[B:%.*]] to i8 +; CHECK-NEXT: [[A2:%.*]] = zext i1 false to i8 +; CHECK-NEXT: [[B2:%.*]] = zext i1 false to i8 ; CHECK-NEXT: [[X2:%.*]] = or i8 [[X:%.*]], [[A2]] ; CHECK-NEXT: [[Y2:%.*]] = or i8 [[Y:%.*]], [[B2]] ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X2]], i8 [[Y2]]) @@ -27,8 +27,8 @@ define i8 @umin(i8 %x, i8 %y, i1 %a, i1 %b) { ; CHECK-LABEL: @umin( -; CHECK-NEXT: [[A2:%.*]] = zext i1 [[A:%.*]] to i8 -; CHECK-NEXT: [[B2:%.*]] = zext i1 [[B:%.*]] to i8 +; CHECK-NEXT: [[A2:%.*]] = zext i1 false to i8 +; CHECK-NEXT: [[B2:%.*]] = zext i1 false to i8 ; CHECK-NEXT: [[X2:%.*]] = or i8 [[X:%.*]], [[A2]] ; CHECK-NEXT: [[Y2:%.*]] = or i8 [[Y:%.*]], [[B2]] ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X2]], i8 [[Y2]]) @@ -46,8 +46,8 @@ define i8 @smax(i8 %x, i8 %y, i1 %a, i1 %b) { ; CHECK-LABEL: @smax( -; CHECK-NEXT: [[A2:%.*]] = zext i1 [[A:%.*]] to i8 -; CHECK-NEXT: [[B2:%.*]] = zext i1 [[B:%.*]] to i8 +; CHECK-NEXT: [[A2:%.*]] = zext i1 false to i8 +; CHECK-NEXT: [[B2:%.*]] = zext i1 false to i8 ; CHECK-NEXT: [[X2:%.*]] = or i8 [[X:%.*]], [[A2]] ; CHECK-NEXT: [[Y2:%.*]] = or i8 [[Y:%.*]], [[B2]] ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X2]], i8 [[Y2]]) @@ -65,8 +65,8 @@ define i8 @smin(i8 %x, i8 %y, i1 %a, i1 %b) { ; CHECK-LABEL: @smin( -; CHECK-NEXT: [[A2:%.*]] = zext i1 [[A:%.*]] to i8 -; CHECK-NEXT: [[B2:%.*]] = zext i1 [[B:%.*]] to i8 +; CHECK-NEXT: [[A2:%.*]] = zext i1 false to i8 +; CHECK-NEXT: [[B2:%.*]] = zext i1 false to i8 ; CHECK-NEXT: [[X2:%.*]] = or i8 [[X:%.*]], [[A2]] ; CHECK-NEXT: [[Y2:%.*]] = or i8 [[Y:%.*]], [[B2]] ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X2]], i8 [[Y2]])