2121#include " mlir/IR/DialectImplementation.h"
2222#include " mlir/IR/DialectResourceBlobManager.h"
2323#include " mlir/IR/IntegerSet.h"
24+ #include " llvm/ADT/APFloat.h"
2425#include " llvm/ADT/StringExtras.h"
2526#include " llvm/Support/Endian.h"
27+ #include < cmath>
2628#include < optional>
2729
2830using namespace mlir ;
@@ -121,14 +123,17 @@ Attribute Parser::parseAttribute(Type type) {
121123
122124 // Parse floating point and integer attributes.
123125 case Token::floatliteral:
126+ case Token::kw_inf:
127+ case Token::kw_nan:
124128 return parseFloatAttr (type, /* isNegative=*/ false );
125129 case Token::integer:
126130 return parseDecOrHexAttr (type, /* isNegative=*/ false );
127131 case Token::minus: {
128132 consumeToken (Token::minus);
129133 if (getToken ().is (Token::integer))
130134 return parseDecOrHexAttr (type, /* isNegative=*/ true );
131- if (getToken ().is (Token::floatliteral))
135+ if (getToken ().is (Token::floatliteral) || getToken ().is (Token::kw_inf) ||
136+ getToken ().is (Token::kw_nan))
132137 return parseFloatAttr (type, /* isNegative=*/ true );
133138
134139 return (emitWrongTokenError (
@@ -342,21 +347,25 @@ ParseResult Parser::parseAttributeDict(NamedAttrList &attributes) {
342347
343348// / Parse a float attribute.
344349Attribute Parser::parseFloatAttr (Type type, bool isNegative) {
345- auto val = getToken ().getFloatingPointValue ();
346- if (!val)
347- return (emitError (" floating point value too large for attribute" ), nullptr );
348- consumeToken (Token::floatliteral);
350+ const Token tok = getToken ();
351+ consumeToken ();
349352 if (!type) {
350353 // Default to F64 when no type is specified.
351354 if (!consumeIf (Token::colon))
352355 type = builder.getF64Type ();
353356 else if (!(type = parseType ()))
354357 return nullptr ;
355358 }
356- if (!isa<FloatType>(type))
357- return (emitError (" floating point value not valid for specified type" ),
359+ auto floatType = dyn_cast<FloatType>(type);
360+ if (!floatType)
361+ return (emitError (tok.getLoc (),
362+ " floating point value not valid for specified type" ),
358363 nullptr );
359- return FloatAttr::get (type, isNegative ? -*val : *val);
364+ std::optional<APFloat> apResult;
365+ if (failed (parseFloatFromLiteral (apResult, tok, isNegative,
366+ floatType.getFloatSemantics ())))
367+ return Attribute ();
368+ return FloatAttr::get (floatType, *apResult);
360369}
361370
362371// / Construct an APint from a parsed value, a known attribute type and
@@ -622,7 +631,7 @@ TensorLiteralParser::getIntAttrElements(SMLoc loc, Type eltTy,
622631 }
623632
624633 // Check to see if floating point values were parsed.
625- if (token.is (Token::floatliteral)) {
634+ if (token.isAny (Token::floatliteral, Token::kw_inf, Token::kw_nan )) {
626635 return p.emitError (tokenLoc)
627636 << " expected integer elements, but parsed floating-point" ;
628637 }
@@ -729,6 +738,8 @@ ParseResult TensorLiteralParser::parseElement() {
729738 // Parse a boolean element.
730739 case Token::kw_true:
731740 case Token::kw_false:
741+ case Token::kw_inf:
742+ case Token::kw_nan:
732743 case Token::floatliteral:
733744 case Token::integer:
734745 storage.emplace_back (/* isNegative=*/ false , p.getToken ());
@@ -738,7 +749,8 @@ ParseResult TensorLiteralParser::parseElement() {
738749 // Parse a signed integer or a negative floating-point element.
739750 case Token::minus:
740751 p.consumeToken (Token::minus);
741- if (!p.getToken ().isAny (Token::floatliteral, Token::integer))
752+ if (!p.getToken ().isAny (Token::floatliteral, Token::kw_inf, Token::kw_nan,
753+ Token::integer))
742754 return p.emitError (" expected integer or floating point literal" );
743755 storage.emplace_back (/* isNegative=*/ true , p.getToken ());
744756 p.consumeToken ();
0 commit comments