[PATCH] D97170: [ValueTracking] Improve ComputeNumSignBits for SRem.
Craig Topper via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sun Feb 21 15:54:18 PST 2021
craig.topper created this revision.
craig.topper added reviewers: RKSimon, spatel.
Herald added a subscriber: hiraditya.
craig.topper requested review of this revision.
Herald added a project: LLVM.
The result will have the same sign as the dividend unless the
result is 0. The magnitude of the result will always be less
than or equal to the dividend. So the result will have at least
as many sign bits as the dividend.
Previously we would do this if the divisor was a positive constant,
but that isn't required.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D97170
Files:
llvm/lib/Analysis/ValueTracking.cpp
llvm/test/Transforms/InstCombine/with_overflow.ll
Index: llvm/test/Transforms/InstCombine/with_overflow.ll
===================================================================
--- llvm/test/Transforms/InstCombine/with_overflow.ll
+++ llvm/test/Transforms/InstCombine/with_overflow.ll
@@ -330,6 +330,17 @@
ret i1 %obit
}
+define i1 @overflow_mod_mul2(i16 %v1, i32 %v2) nounwind {
+; CHECK-LABEL: @overflow_mod_mul2(
+; CHECK-NEXT: ret i1 false
+;
+ %a = sext i16 %v1 to i32
+ %rem = srem i32 %a, %v2
+ %t = call { i32, i1 } @llvm.smul.with.overflow.i32(i32 %rem, i32 %rem)
+ %obit = extractvalue { i32, i1 } %t, 1
+ ret i1 %obit
+}
+
define { i32, i1 } @ssubtest_reorder(i8 %a) {
; CHECK-LABEL: @ssubtest_reorder(
; CHECK-NEXT: [[AA:%.*]] = sext i8 [[A:%.*]] to i32
Index: llvm/lib/Analysis/ValueTracking.cpp
===================================================================
--- llvm/lib/Analysis/ValueTracking.cpp
+++ llvm/lib/Analysis/ValueTracking.cpp
@@ -2784,6 +2784,8 @@
}
case Instruction::SRem: {
+ Tmp = ComputeNumSignBits(U->getOperand(0), Depth + 1, Q);
+
const APInt *Denominator;
// srem X, C -> we know that the result is within [-C+1,C) when C is a
// positive constant. This let us put a lower bound on the number of sign
@@ -2791,30 +2793,25 @@
if (match(U->getOperand(1), m_APInt(Denominator))) {
// Ignore non-positive denominator.
- if (!Denominator->isStrictlyPositive())
- break;
-
- // Calculate the incoming numerator bits. SRem by a positive constant
- // can't lower the number of sign bits.
- unsigned NumrBits = ComputeNumSignBits(U->getOperand(0), Depth + 1, Q);
-
- // Calculate the leading sign bit constraints by examining the
- // denominator. Given that the denominator is positive, there are two
- // cases:
- //
- // 1. the numerator is positive. The result range is [0,C) and [0,C) u<
- // (1 << ceilLogBase2(C)).
- //
- // 2. the numerator is negative. Then the result range is (-C,0] and
- // integers in (-C,0] are either 0 or >u (-1 << ceilLogBase2(C)).
- //
- // Thus a lower bound on the number of sign bits is `TyBits -
- // ceilLogBase2(C)`.
-
- unsigned ResBits = TyBits - Denominator->ceilLogBase2();
- return std::max(NumrBits, ResBits);
+ if (Denominator->isStrictlyPositive()) {
+ // Calculate the leading sign bit constraints by examining the
+ // denominator. Given that the denominator is positive, there are two
+ // cases:
+ //
+ // 1. The numerator is positive. The result range is [0,C) and
+ // [0,C) u< (1 << ceilLogBase2(C)).
+ //
+ // 2. The numerator is negative. Then the result range is (-C,0] and
+ // integers in (-C,0] are either 0 or >u (-1 << ceilLogBase2(C)).
+ //
+ // Thus a lower bound on the number of sign bits is `TyBits -
+ // ceilLogBase2(C)`.
+
+ unsigned ResBits = TyBits - Denominator->ceilLogBase2();
+ Tmp = std::max(Tmp, ResBits);
+ }
}
- break;
+ return Tmp;
}
case Instruction::AShr: {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D97170.325352.patch
Type: text/x-patch
Size: 3225 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210221/cd4629e7/attachment.bin>
More information about the llvm-commits
mailing list