Skip to content

Commit 25a21e0

Browse files
authored
Merge pull request #192 from Xilinx/tiagot.dont_assert_log2_inexact
fix: don't assert when calculating log2 of non-power-of-two number, fail instead.
2 parents 17f7259 + 5d9a2e3 commit 25a21e0

File tree

2 files changed

+19
-8
lines changed

2 files changed

+19
-8
lines changed

mlir/lib/Dialect/PDL/IR/Builtins.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,20 +85,26 @@ LogicalResult static unaryOp(PatternRewriter &rewriter, PDLResultList &results,
8585

8686
results.push_back(rewriter.getIntegerAttr(integerType, resultInt));
8787
} else if constexpr (T == UnaryOpKind::log2) {
88-
auto getIntegerAsAttr = [&](const APSInt &value) {
88+
auto getIntegerAsAttr = [&](const APSInt &value) -> Attribute {
89+
// Only calculate values for exact log2.
8990
int32_t log2Value = value.exactLogBase2();
90-
assert(log2Value >= 0 &&
91-
"log2 of an integer is expected to return an exact integer.");
91+
if (log2Value < 0)
92+
return Attribute();
9293
return rewriter.getIntegerAttr(
9394
integerType,
9495
APSInt(APInt(bitWidth, log2Value), integerType.isUnsigned()));
9596
};
9697
// for log2 we treat signless integer as signed
98+
Attribute log2IntegerAttr;
9799
if (integerType.isSignless())
98-
results.push_back(
99-
getIntegerAsAttr(APSInt(operandIntAttr.getValue(), false)));
100+
log2IntegerAttr =
101+
getIntegerAsAttr(APSInt(operandIntAttr.getValue(), false));
100102
else
101-
results.push_back(getIntegerAsAttr(operandIntAttr.getAPSInt()));
103+
log2IntegerAttr = getIntegerAsAttr(operandIntAttr.getAPSInt());
104+
// Return failure if log2 value isn't exact.
105+
if (!log2IntegerAttr)
106+
return failure();
107+
results.push_back(log2IntegerAttr);
102108
} else if constexpr (T == UnaryOpKind::abs) {
103109
if (integerType.isSigned()) {
104110
// check overflow

mlir/unittests/Dialect/PDL/BuiltinTest.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -613,8 +613,13 @@ TEST_F(BuiltinTest, log2) {
613613
auto zeroI32 = rewriter.getI32IntegerAttr(0);
614614
{
615615
TestPDLResultList results(1);
616-
EXPECT_DEATH(static_cast<void>(builtin::log2(rewriter, results, {zeroI32})),
617-
"log2 of an integer is expected to return an exact integer.");
616+
EXPECT_FALSE(builtin::log2(rewriter, results, {zeroI32}).succeeded());
617+
}
618+
619+
auto minusOneI32 = rewriter.getI32IntegerAttr(-1);
620+
{
621+
TestPDLResultList results(1);
622+
EXPECT_FALSE(builtin::log2(rewriter, results, {minusOneI32}).succeeded());
618623
}
619624

620625
auto fourF16 = rewriter.getF16FloatAttr(4.0);

0 commit comments

Comments
 (0)