[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