[PATCH] D116616: [InstSimplify] use knownbits to fold more udiv/urem

Sanjay Patel via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 6 07:48:57 PST 2022


spatel updated this revision to Diff 397887.
spatel added a comment.

Patch updated:
I removed the MaxRecurse usage from the call to computeKnownBits. Similar calls around this file don't do that (ie, we're ok using the full recursive power of knownbits independent of whether we are recursing within InstSimplify calls themselves).

This allows the call to fit neatly within 80-cols, so the patch is just a single 'if' check now. :)


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D116616/new/

https://reviews.llvm.org/D116616

Files:
  llvm/lib/Analysis/InstructionSimplify.cpp
  llvm/test/Transforms/InstSimplify/div.ll
  llvm/test/Transforms/InstSimplify/rem.ll


Index: llvm/test/Transforms/InstSimplify/rem.ll
===================================================================
--- llvm/test/Transforms/InstSimplify/rem.ll
+++ llvm/test/Transforms/InstSimplify/rem.ll
@@ -187,8 +187,7 @@
 ; CHECK-LABEL: @urem_dividend_known_smaller_than_constant_divisor2(
 ; CHECK-NEXT:    [[T0:%.*]] = zext i1 [[B:%.*]] to i8
 ; CHECK-NEXT:    [[XOR:%.*]] = xor i8 [[T0]], 12
-; CHECK-NEXT:    [[R:%.*]] = urem i8 [[XOR]], 14
-; CHECK-NEXT:    ret i8 [[R]]
+; CHECK-NEXT:    ret i8 [[XOR]]
 ;
   %t0 = zext i1 %b to i8
   %xor = xor i8 %t0, 12
@@ -196,6 +195,8 @@
   ret i8 %r
 }
 
+; negative test - dividend can equal 13
+
 define i8 @not_urem_dividend_known_smaller_than_constant_divisor2(i1 %b) {
 ; CHECK-LABEL: @not_urem_dividend_known_smaller_than_constant_divisor2(
 ; CHECK-NEXT:    [[T0:%.*]] = zext i1 [[B:%.*]] to i8
Index: llvm/test/Transforms/InstSimplify/div.ll
===================================================================
--- llvm/test/Transforms/InstSimplify/div.ll
+++ llvm/test/Transforms/InstSimplify/div.ll
@@ -155,10 +155,7 @@
 
 define i8 @udiv_dividend_known_smaller_than_constant_divisor2(i1 %b) {
 ; CHECK-LABEL: @udiv_dividend_known_smaller_than_constant_divisor2(
-; CHECK-NEXT:    [[T0:%.*]] = zext i1 [[B:%.*]] to i8
-; CHECK-NEXT:    [[XOR:%.*]] = xor i8 [[T0]], 12
-; CHECK-NEXT:    [[R:%.*]] = udiv i8 [[XOR]], 14
-; CHECK-NEXT:    ret i8 [[R]]
+; CHECK-NEXT:    ret i8 0
 ;
   %t0 = zext i1 %b to i8
   %xor = xor i8 %t0, 12
@@ -166,6 +163,8 @@
   ret i8 %r
 }
 
+; negative test - dividend can equal 13
+
 define i8 @not_udiv_dividend_known_smaller_than_constant_divisor2(i1 %b) {
 ; CHECK-LABEL: @not_udiv_dividend_known_smaller_than_constant_divisor2(
 ; CHECK-NEXT:    [[T0:%.*]] = zext i1 [[B:%.*]] to i8
Index: llvm/lib/Analysis/InstructionSimplify.cpp
===================================================================
--- llvm/lib/Analysis/InstructionSimplify.cpp
+++ llvm/lib/Analysis/InstructionSimplify.cpp
@@ -1078,6 +1078,16 @@
   }
 
   // IsSigned == false.
+
+  // Is the unsigned dividend known to be less than a constant divisor?
+  // TODO: Convert this (and above) to range analysis
+  //      ("computeConstantRangeIncludingKnownBits")?
+  const APInt *C;
+  if (match(Y, m_APInt(C)) &&
+      computeKnownBits(X, Q.DL, 0, Q.AC, Q.CxtI, Q.DT).getMaxValue().ult(*C))
+    return true;
+
+  // Try again for any divisor:
   // Is the dividend unsigned less than the divisor?
   return isICmpTrue(ICmpInst::ICMP_ULT, X, Y, Q, MaxRecurse);
 }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D116616.397887.patch
Type: text/x-patch
Size: 2526 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220106/baff08cb/attachment.bin>


More information about the llvm-commits mailing list