Correct the implementation of srem to be remainder, not modulus. The sign of
the result must follow the sign of the divisor.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35302 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/llvm/ADT/APInt.h b/include/llvm/ADT/APInt.h
index 44b5fd0..52509ed 100644
--- a/include/llvm/ADT/APInt.h
+++ b/include/llvm/ADT/APInt.h
@@ -564,9 +564,9 @@
inline APInt srem(const APInt& RHS) const {
if (isNegative())
if (RHS.isNegative())
- return (-(*this)).urem(-RHS);
+ return -((-(*this)).urem(-RHS));
else
- return -((-(*this)).urem(RHS));
+ return (-(*this)).urem(RHS);
else if (RHS.isNegative())
return -(this->urem(-RHS));
return this->urem(RHS);