From 2c7b7eca85c2ccc9b0d5c65169213ce499652f92 Mon Sep 17 00:00:00 2001 From: Tyker Date: Mon, 10 Oct 2022 10:35:47 +0200 Subject: [PATCH] [ADT] Fix Incorrect rounding for APFixedPoint::getIntPart --- llvm/include/llvm/ADT/APFixedPoint.h | 2 +- llvm/unittests/ADT/APFixedPointTest.cpp | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/llvm/include/llvm/ADT/APFixedPoint.h b/llvm/include/llvm/ADT/APFixedPoint.h index e151089..0b72fcc 100644 --- a/llvm/include/llvm/ADT/APFixedPoint.h +++ b/llvm/include/llvm/ADT/APFixedPoint.h @@ -214,7 +214,7 @@ public: APSInt ExtVal = (getLsbWeight() > 0) ? Val.extend(getWidth() + getLsbWeight()) : Val; if (Val < 0 && Val != -Val) // Cover the case when we have the min val - return -(-ExtVal.relativeShl(getLsbWeight())); + return -((-ExtVal).relativeShl(getLsbWeight())); return ExtVal.relativeShl(getLsbWeight()); } diff --git a/llvm/unittests/ADT/APFixedPointTest.cpp b/llvm/unittests/ADT/APFixedPointTest.cpp index 0b85db5..3a19763 100644 --- a/llvm/unittests/ADT/APFixedPointTest.cpp +++ b/llvm/unittests/ADT/APFixedPointTest.cpp @@ -276,6 +276,11 @@ void CheckIntPartMax(const FixedPointSemantics &Sema, uint64_t Expected) { APSInt::getUnsigned(Expected)) == 0); } +void CheckIntPartRes(const FixedPointSemantics &Sema, int64_t Representation, int64_t Result) { + APFixedPoint Val(Representation, Sema); + ASSERT_EQ(Val.getIntPart().getZExtValue(), Result) ; +} + TEST(FixedPoint, getIntPart) { // Normal values CheckIntPart(getSAccumSema(), 2); @@ -359,6 +364,12 @@ TEST(FixedPoint, getIntPart) { CheckIntPartMax(getPadUSFractSema(), 0); CheckIntPartMax(getPadUFractSema(), 0); CheckIntPartMax(getPadULFractSema(), 0); + + // Rounded Towards Zero + CheckIntPartRes(getSFractSema(), -127, 0); + CheckIntPartRes(getFractSema(), -32767, 0); + CheckIntPartRes(getLFractSema(), -2147483647, 0); + CheckIntPartRes(getS16Neg18(), -32768, 0); } TEST(FixedPoint, compare) { -- 2.7.4