[clang] [llvm] [IR][AsmParser] Revamp how floating-point literals in LLVM IR. (PR #121838)
Min-Yih Hsu via cfe-commits
cfe-commits at lists.llvm.org
Tue Jan 7 10:56:26 PST 2025
================
@@ -3829,10 +3829,40 @@ bool LLParser::parseValID(ValID &ID, PerFunctionState *PFS, Type *ExpectedTy) {
ID.APSIntVal = Lex.getAPSIntVal();
ID.Kind = ValID::t_APSInt;
break;
- case lltok::APFloat:
+ case lltok::APFloat: {
+ assert(ExpectedTy && "Need type to parse float values");
ID.APFloatVal = Lex.getAPFloatVal();
ID.Kind = ValID::t_APFloat;
break;
+ }
+ case lltok::FloatLiteral: {
+ assert(ExpectedTy && "Need type to parse float values");
+ if (!ExpectedTy->isFloatingPointTy())
+ return error(ID.Loc, "floating point constant invalid for type");
+ ID.APFloatVal = APFloat(ExpectedTy->getFltSemantics());
+ auto Except = ID.APFloatVal.convertFromString(
+ Lex.getStrVal(), RoundingMode::NearestTiesToEven);
+ assert(Except && "Invalid float strings should be caught by the lexer");
+ // Forbid overflowing and underflowing literals, but permit inexact
+ // literals. Underflow is thrown when the result is denormal, so to allow
+ // denormals, only reject underflowing literals that resulted in a zero.
+ if (*Except & APFloat::opOverflow)
+ return error(ID.Loc, "floating point constant overflowed type");
+ if ((*Except & APFloat::opUnderflow) && ID.APFloatVal.isZero())
+ return error(ID.Loc, "floating point constant underflowed type");
+ ID.Kind = ValID::t_APFloat;
+ break;
+ }
+ case lltok::FloatHexLiteral: {
+ assert(ExpectedTy && "Need type to parse float values");
+ auto &Semantics = ExpectedTy->getFltSemantics();
----------------
mshockwave wrote:
nit: `const auto &`
https://github.com/llvm/llvm-project/pull/121838
More information about the cfe-commits
mailing list