[APInt] Keep the original bit width in quotient and remainder

Some trivial cases in udivrem were handled by directly assigning 0 or 1
to APInt objects. This would set the bit width to 1, instead of the bit
width of the inputs. A potentially undesirable side effect of that is
that with the bit width of 1, 1 equals -1.

Differential Revision: https://reviews.llvm.org/D49554


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@337478 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Krzysztof Parzyszek
2018-07-19 18:07:56 +00:00
parent 5b81b48075
commit 3bb52cad65
2 changed files with 49 additions and 16 deletions
+17 -16
View File
@@ -1735,25 +1735,25 @@ void APInt::udivrem(const APInt &LHS, const APInt &RHS,
// Check the degenerate cases
if (lhsWords == 0) {
Quotient = 0; // 0 / Y ===> 0
Remainder = 0; // 0 % Y ===> 0
Quotient = APInt(BitWidth, 0); // 0 / Y ===> 0
Remainder = APInt(BitWidth, 0); // 0 % Y ===> 0
return;
}
if (rhsBits == 1) {
Quotient = LHS; // X / 1 ===> X
Remainder = 0; // X % 1 ===> 0
Quotient = LHS; // X / 1 ===> X
Remainder = APInt(BitWidth, 0); // X % 1 ===> 0
}
if (lhsWords < rhsWords || LHS.ult(RHS)) {
Remainder = LHS; // X % Y ===> X, iff X < Y
Quotient = 0; // X / Y ===> 0, iff X < Y
Remainder = LHS; // X % Y ===> X, iff X < Y
Quotient = APInt(BitWidth, 0); // X / Y ===> 0, iff X < Y
return;
}
if (LHS == RHS) {
Quotient = 1; // X / X ===> 1
Remainder = 0; // X % X ===> 0;
Quotient = APInt(BitWidth, 1); // X / X ===> 1
Remainder = APInt(BitWidth, 0); // X % X ===> 0;
return;
}
@@ -1801,25 +1801,26 @@ void APInt::udivrem(const APInt &LHS, uint64_t RHS, APInt &Quotient,
// Check the degenerate cases
if (lhsWords == 0) {
Quotient = 0; // 0 / Y ===> 0
Remainder = 0; // 0 % Y ===> 0
Quotient = APInt(BitWidth, 0); // 0 / Y ===> 0
Remainder = 0; // 0 % Y ===> 0
return;
}
if (RHS == 1) {
Quotient = LHS; // X / 1 ===> X
Remainder = 0; // X % 1 ===> 0
Quotient = LHS; // X / 1 ===> X
Remainder = 0; // X % 1 ===> 0
return;
}
if (LHS.ult(RHS)) {
Remainder = LHS.getZExtValue(); // X % Y ===> X, iff X < Y
Quotient = 0; // X / Y ===> 0, iff X < Y
Remainder = LHS.getZExtValue(); // X % Y ===> X, iff X < Y
Quotient = APInt(BitWidth, 0); // X / Y ===> 0, iff X < Y
return;
}
if (LHS == RHS) {
Quotient = 1; // X / X ===> 1
Remainder = 0; // X % X ===> 0;
Quotient = APInt(BitWidth, 1); // X / X ===> 1
Remainder = 0; // X % X ===> 0;
return;
}