summaryrefslogtreecommitdiffstats
path: root/llvm/lib/MC/MCParser/AsmParser.cpp
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2010-02-13 01:28:07 +0000
committerDaniel Dunbar <daniel@zuster.org>2010-02-13 01:28:07 +0000
commitd0c6d361fec1cf0bf5ac19a4f963e4d0ef662f3d (patch)
tree7f61bf3fc975dee36778240639e9dd3f8a225926 /llvm/lib/MC/MCParser/AsmParser.cpp
parentb0208d2a0669f7b833371884cfd4abfb3af627f7 (diff)
downloadbcm5719-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.cpp12
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) {
OpenPOWER on IntegriCloud