forked from OSchip/llvm-project
[mlir][Support] Avoid multiplication in floorDiv / ceilDiv
Using comparisons instead avoids potential overflow. Differential Revision: https://reviews.llvm.org/D116096
This commit is contained in:
parent
55d7a12b86
commit
8761f5ebf7
|
@ -24,7 +24,8 @@ inline int64_t ceilDiv(int64_t lhs, int64_t rhs) {
|
|||
assert(rhs != 0);
|
||||
// C/C++'s integer division rounds towards 0.
|
||||
int64_t x = (rhs > 0) ? -1 : 1;
|
||||
return (lhs * rhs > 0) ? ((lhs + x) / rhs) + 1 : -(-lhs / rhs);
|
||||
return ((lhs != 0) && (lhs > 0) == (rhs > 0)) ? ((lhs + x) / rhs) + 1
|
||||
: -(-lhs / rhs);
|
||||
}
|
||||
|
||||
/// Returns the result of MLIR's floordiv operation on constants. The RHS is
|
||||
|
@ -33,7 +34,8 @@ inline int64_t floorDiv(int64_t lhs, int64_t rhs) {
|
|||
assert(rhs != 0);
|
||||
// C/C++'s integer division rounds towards 0.
|
||||
int64_t x = (rhs < 0) ? 1 : -1;
|
||||
return (lhs * rhs < 0) ? -((-lhs + x) / rhs) - 1 : lhs / rhs;
|
||||
return ((lhs != 0) && ((lhs < 0) != (rhs < 0))) ? -((-lhs + x) / rhs) - 1
|
||||
: lhs / rhs;
|
||||
}
|
||||
|
||||
/// Returns MLIR's mod operation on constants. MLIR's mod operation yields the
|
||||
|
|
|
@ -17,6 +17,8 @@ TEST(MathExtrasTest, CeilDivTest) {
|
|||
EXPECT_THAT(ceilDiv(14, -3), Eq(-4));
|
||||
EXPECT_THAT(ceilDiv(-14, -3), Eq(5));
|
||||
EXPECT_THAT(ceilDiv(-14, 3), Eq(-4));
|
||||
EXPECT_THAT(ceilDiv(0, 3), Eq(0));
|
||||
EXPECT_THAT(ceilDiv(0, -3), Eq(0));
|
||||
}
|
||||
|
||||
TEST(MathExtrasTest, FloorDivTest) {
|
||||
|
@ -24,4 +26,6 @@ TEST(MathExtrasTest, FloorDivTest) {
|
|||
EXPECT_THAT(floorDiv(14, -3), Eq(-5));
|
||||
EXPECT_THAT(floorDiv(-14, -3), Eq(4));
|
||||
EXPECT_THAT(floorDiv(-14, 3), Eq(-5));
|
||||
EXPECT_THAT(floorDiv(0, 3), Eq(0));
|
||||
EXPECT_THAT(floorDiv(0, -3), Eq(0));
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue