@@ -85,20 +85,26 @@ LogicalResult static unaryOp(PatternRewriter &rewriter, PDLResultList &results,
85
85
86
86
results.push_back (rewriter.getIntegerAttr (integerType, resultInt));
87
87
} 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.
89
90
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 ( );
92
93
return rewriter.getIntegerAttr (
93
94
integerType,
94
95
APSInt (APInt (bitWidth, log2Value), integerType.isUnsigned ()));
95
96
};
96
97
// for log2 we treat signless integer as signed
98
+ Attribute log2IntegerAttr;
97
99
if (integerType.isSignless ())
98
- results. push_back (
99
- getIntegerAsAttr (APSInt (operandIntAttr.getValue (), false ))) ;
100
+ log2IntegerAttr =
101
+ getIntegerAsAttr (APSInt (operandIntAttr.getValue (), false ));
100
102
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);
102
108
} else if constexpr (T == UnaryOpKind::abs) {
103
109
if (integerType.isSigned ()) {
104
110
// check overflow
0 commit comments