[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