[PATCH] D101840: [InstSimplify] ctlz(zext(x)) -> 0 if X is known negative number
Dávid Bolvanský via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue May 4 08:32:28 PDT 2021
xbolva00 created this revision.
xbolva00 added reviewers: RKSimon, spatel.
Herald added a subscriber: hiraditya.
xbolva00 requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
----------------------------------------
define i32 @src(i16 %x, i1 %zerodef) {
%0:
%assume = icmp slt i16 %x, 0
assume i1 %assume
%s = sext i16 %x to i32
%c = ctlz i32 %s, %zerodef
ret i32 %c
}
=>
define i32 @tgt(i16 %x, i1 %zerodef) {
%0:
%assume = icmp slt i16 %x, 0
assume i1 %assume
ret i32 0
}
Transformation seems to be correct!
Proof: https://alive2.llvm.org/ce/z/3H24HZ
Solves second case in https://bugs.llvm.org/show_bug.cgi?id=50173
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D101840
Files:
llvm/lib/Analysis/InstructionSimplify.cpp
llvm/test/Transforms/InstSimplify/call.ll
Index: llvm/test/Transforms/InstSimplify/call.ll
===================================================================
--- llvm/test/Transforms/InstSimplify/call.ll
+++ 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)
Index: llvm/lib/Analysis/InstructionSimplify.cpp
===================================================================
--- llvm/lib/Analysis/InstructionSimplify.cpp
+++ 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:
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D101840.342751.patch
Type: text/x-patch
Size: 2036 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210504/2b8580d7/attachment.bin>
More information about the llvm-commits
mailing list