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 @@ -5411,6 +5411,9 @@ return X; if (match(Op0, m_AShr(m_Negative(), m_Value()))) return Constant::getNullValue(ReturnType); + if (match(Op0, m_SExt(m_Value(X))) && + isKnownNegative(X, Q.DL, /*Depth=*/0, Q.AC, Q.CxtI, Q.DT)) + return Constant::getNullValue(ReturnType); break; } case Intrinsic::smax: diff --git a/llvm/test/Transforms/InstSimplify/call.ll b/llvm/test/Transforms/InstSimplify/call.ll --- a/llvm/test/Transforms/InstSimplify/call.ll +++ b/llvm/test/Transforms/InstSimplify/call.ll @@ -1469,9 +1469,7 @@ ; CHECK-LABEL: @ctlz_sext_negative_zero_undef( ; CHECK-NEXT: [[ASSUME:%.*]] = icmp slt i16 [[X:%.*]], 0 ; CHECK-NEXT: call void @llvm.assume(i1 [[ASSUME]]) -; CHECK-NEXT: [[S:%.*]] = sext i16 [[X]] to i32 -; CHECK-NEXT: [[C:%.*]] = call i32 @llvm.ctlz.i32(i32 [[S]], i1 true) -; CHECK-NEXT: ret i32 [[C]] +; CHECK-NEXT: ret i32 0 ; %assume = icmp slt i16 %x, 0 call void @llvm.assume(i1 %assume) @@ -1484,9 +1482,7 @@ ; CHECK-LABEL: @ctlz_sext_negative_zero_def( ; CHECK-NEXT: [[ASSUME:%.*]] = icmp slt i16 [[X:%.*]], 0 ; CHECK-NEXT: call void @llvm.assume(i1 [[ASSUME]]) -; CHECK-NEXT: [[S:%.*]] = sext i16 [[X]] to i32 -; CHECK-NEXT: [[C:%.*]] = call i32 @llvm.ctlz.i32(i32 [[S]], i1 false) -; CHECK-NEXT: ret i32 [[C]] +; CHECK-NEXT: ret i32 0 ; %assume = icmp slt i16 %x, 0 call void @llvm.assume(i1 %assume) @@ -1502,8 +1498,7 @@ ; CHECK-NEXT: call void @llvm.assume(i1 [[ASSUME]]) ; CHECK-NEXT: [[S:%.*]] = sext i16 [[X]] to i32 ; CHECK-NEXT: call void @use(i32 [[S]]) -; CHECK-NEXT: [[C:%.*]] = call i32 @llvm.ctlz.i32(i32 [[S]], i1 true) -; CHECK-NEXT: ret i32 [[C]] +; CHECK-NEXT: ret i32 0 ; %assume = icmp slt i16 %x, 0 call void @llvm.assume(i1 %assume)