diff options
author | Daniel Dunbar <daniel@zuster.org> | 2010-02-13 01:28:07 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2010-02-13 01:28:07 +0000 |
commit | d0c6d361fec1cf0bf5ac19a4f963e4d0ef662f3d (patch) | |
tree | 7f61bf3fc975dee36778240639e9dd3f8a225926 /llvm/lib/MC/MCParser/AsmParser.cpp | |
parent | b0208d2a0669f7b833371884cfd4abfb3af627f7 (diff) | |
download | bcm5719-llvm-d0c6d361fec1cf0bf5ac19a4f963e4d0ef662f3d.tar.gz bcm5719-llvm-d0c6d361fec1cf0bf5ac19a4f963e4d0ef662f3d.zip |
MC/AsmParser: Attempt to constant fold expressions up-front. This ensures we avoid fixups for obvious cases like '-(16)'.
llvm-svn: 96064
Diffstat (limited to 'llvm/lib/MC/MCParser/AsmParser.cpp')
-rw-r--r-- | llvm/lib/MC/MCParser/AsmParser.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp index d5bc396103f..51ad5d18f3b 100644 --- a/llvm/lib/MC/MCParser/AsmParser.cpp +++ b/llvm/lib/MC/MCParser/AsmParser.cpp @@ -325,9 +325,17 @@ bool AsmParser::ParseExpression(const MCExpr *&Res) { /// expr ::= primaryexpr /// bool AsmParser::ParseExpression(const MCExpr *&Res, SMLoc &EndLoc) { + // Parse the expression. Res = 0; - return ParsePrimaryExpr(Res, EndLoc) || - ParseBinOpRHS(1, Res, EndLoc); + if (ParsePrimaryExpr(Res, EndLoc) || ParseBinOpRHS(1, Res, EndLoc)) + return true; + + // Try to constant fold it up front, if possible. + int64_t Value; + if (Res->EvaluateAsAbsolute(Value)) + Res = MCConstantExpr::Create(Value, getContext()); + + return false; } bool AsmParser::ParseParenExpression(const MCExpr *&Res, SMLoc &EndLoc) { |