diff options
author | Chris Lattner <sabre@nondot.org> | 2002-08-14 17:12:33 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-08-14 17:12:33 +0000 |
commit | 699f1eb214fe6574986527b07d4f226ab0f86d64 (patch) | |
tree | 67f771fff70eb9284a0962c4eccdc5cd0179cb2c /lib | |
parent | 227b86c5fbf8b6d92b2ccc457264c978f67a61ce (diff) | |
download | external_llvm-699f1eb214fe6574986527b07d4f226ab0f86d64.zip external_llvm-699f1eb214fe6574986527b07d4f226ab0f86d64.tar.gz external_llvm-699f1eb214fe6574986527b07d4f226ab0f86d64.tar.bz2 |
AsmParser turns 'not' instructions into 'xor' instructions now.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3309 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/AsmParser/Lexer.l | 8 | ||||
-rw-r--r-- | lib/AsmParser/llvmAsmParser.y | 34 |
2 files changed, 17 insertions, 25 deletions
diff --git a/lib/AsmParser/Lexer.l b/lib/AsmParser/Lexer.l index b837325..1613e5f 100644 --- a/lib/AsmParser/Lexer.l +++ b/lib/AsmParser/Lexer.l @@ -1,8 +1,8 @@ -/*===-- Lexer.l - Scanner for llvm assembly files ----------------*- C++ -*--=// +/*===-- Lexer.l - Scanner for llvm assembly files --------------*- C++ -*--===// // // This file implements the flex scanner for LLVM assembly languages files. // -//===------------------------------------------------------------------------=*/ +//===----------------------------------------------------------------------===*/ %option prefix="llvmAsm" %option yylineno @@ -162,6 +162,7 @@ string { return STRING; } null { return NULL_TOK; } to { return TO; } except { return EXCEPT; } +not { return NOT; } /* Deprecated, turned into XOR */ void { llvmAsmlval.PrimType = Type::VoidTy ; return VOID; } bool { llvmAsmlval.PrimType = Type::BoolTy ; return BOOL; } @@ -179,9 +180,6 @@ type { llvmAsmlval.PrimType = Type::TypeTy ; return TYPE; } label { llvmAsmlval.PrimType = Type::LabelTy ; return LABEL; } opaque { return OPAQUE; } - -not { RET_TOK(UnaryOpVal, Not, NOT); } - add { RET_TOK(BinaryOpVal, Add, ADD); } sub { RET_TOK(BinaryOpVal, Sub, SUB); } mul { RET_TOK(BinaryOpVal, Mul, MUL); } diff --git a/lib/AsmParser/llvmAsmParser.y b/lib/AsmParser/llvmAsmParser.y index 828c41a..6b85865 100644 --- a/lib/AsmParser/llvmAsmParser.y +++ b/lib/AsmParser/llvmAsmParser.y @@ -22,7 +22,6 @@ using std::pair; using std::map; using std::pair; using std::make_pair; -using std::cerr; using std::string; int yyerror(const char *ErrorMsg); // Forward declarations to prevent "implicit @@ -37,7 +36,7 @@ string CurFilename; // //#define DEBUG_UPREFS 1 #ifdef DEBUG_UPREFS -#define UR_OUT(X) cerr << X +#define UR_OUT(X) std::cerr << X #else #define UR_OUT(X) #endif @@ -494,7 +493,7 @@ static bool setValueName(Value *V, char *NameStr) { // is defined the same as the old one... if (const Type *Ty = dyn_cast<const Type>(Existing)) { if (Ty == cast<const Type>(V)) return true; // Yes, it's equal. - // cerr << "Type: " << Ty->getDescription() << " != " + // std::cerr << "Type: " << Ty->getDescription() << " != " // << cast<const Type>(V)->getDescription() << "!\n"; } else if (GlobalVariable *EGV = dyn_cast<GlobalVariable>(Existing)) { // We are allowed to redefine a global variable in two circumstances: @@ -621,7 +620,6 @@ Module *RunVMAsmParser(const string &Filename, FILE *F) { char *StrVal; // This memory is strdup'd! ValID ValIDVal; // strdup'd memory maybe! - Instruction::UnaryOps UnaryOpVal; Instruction::BinaryOps BinaryOpVal; Instruction::TermOps TermOpVal; Instruction::MemoryOps MemOpVal; @@ -672,15 +670,11 @@ Module *RunVMAsmParser(const string &Filename, FILE *F) { %token IMPLEMENTATION TRUE FALSE BEGINTOK ENDTOK DECLARE GLOBAL CONSTANT UNINIT -%token TO EXCEPT DOTDOTDOT STRING NULL_TOK CONST INTERNAL OPAQUE +%token TO EXCEPT DOTDOTDOT STRING NULL_TOK CONST INTERNAL OPAQUE NOT // Basic Block Terminating Operators %token <TermOpVal> RET BR SWITCH -// Unary Operators -%type <UnaryOpVal> UnaryOps // all the unary operators -%token <UnaryOpVal> NOT - // Binary Operators %type <BinaryOpVal> BinaryOps // all the binary operators %token <BinaryOpVal> ADD SUB MUL DIV REM AND OR XOR @@ -717,7 +711,6 @@ EINT64VAL : EUINT64VAL { // Operations that are notably excluded from this list include: // RET, BR, & SWITCH because they end basic blocks and are treated specially. // -UnaryOps : NOT; BinaryOps : ADD | SUB | MUL | DIV | REM | AND | OR | XOR; BinaryOps : SETLE | SETGE | SETLT | SETGT | SETEQ | SETNE; ShiftOps : SHL | SHR; @@ -970,7 +963,6 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr // FIXME: ConstExpr::get never return null! Do checking here in the parser. ConstExpr: Types CAST ConstVal { $$ = ConstantExpr::get(Instruction::Cast, $3, $1->get()); - if ($$ == 0) ThrowException("constant expression builder returned null!"); delete $1; } | Types GETELEMENTPTR '(' ConstVal IndexList ')' { @@ -996,10 +988,6 @@ ConstExpr: Types CAST ConstVal { $$ = ConstantExpr::getGetElementPtr($4, IdxVec); delete $1; } - | Types UnaryOps ConstVal { - $$ = ConstantExpr::get($2, $3, $1->get()); - delete $1; - } | Types BinaryOps ConstVal ',' ConstVal { if ($3->getType() != $5->getType()) ThrowException("Binary operator types must match!"); @@ -1016,8 +1004,7 @@ ConstExpr: Types CAST ConstVal { $$ = ConstantExpr::get($2, $3, $5); delete $1; - } - ; + }; ConstVal : SIntType EINT64VAL { // integral constants @@ -1510,10 +1497,17 @@ InstVal : BinaryOps Types ValueRef ',' ValueRef { ThrowException("binary operator returned null!"); delete $2; } - | UnaryOps ResolvedVal { - $$ = UnaryOperator::create($1, $2); + | NOT ResolvedVal { + std::cerr << "WARNING: Use of eliminated 'not' instruction:" + << " Replacing with 'xor'.\n"; + + Value *Ones = ConstantIntegral::getAllOnesValue($2->getType()); + if (Ones == 0) + ThrowException("Expected integral type for not instruction!"); + + $$ = BinaryOperator::create(Instruction::Xor, $2, Ones); if ($$ == 0) - ThrowException("unary operator returned null!"); + ThrowException("Could not create a xor instruction!"); } | ShiftOps ResolvedVal ',' ResolvedVal { if ($4->getType() != Type::UByteTy) |