diff options
Diffstat (limited to 'lib/AsmParser/llvmAsmParser.y')
-rw-r--r-- | lib/AsmParser/llvmAsmParser.y | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/lib/AsmParser/llvmAsmParser.y b/lib/AsmParser/llvmAsmParser.y index 9c68cfca5d..2868fdd1b3 100644 --- a/lib/AsmParser/llvmAsmParser.y +++ b/lib/AsmParser/llvmAsmParser.y @@ -876,7 +876,7 @@ using namespace llvm; // Other Operators %type <OtherOpVal> ShiftOps -%token <OtherOpVal> PHI_TOK CALL CAST SHL SHR VAARG VANEXT +%token <OtherOpVal> PHI_TOK CALL CAST SELECT SHL SHR VAARG VANEXT %token VA_ARG // FIXME: OBSOLETE %start Module @@ -1251,6 +1251,13 @@ ConstExpr: CAST '(' ConstVal TO Types ')' { $$ = ConstantExpr::getGetElementPtr($3, IdxVec); } + | SELECT '(' ConstVal ',' ConstVal ',' ConstVal ')' { + if ($3->getType() != Type::BoolTy) + ThrowException("Select condition must be of boolean type!"); + if ($5->getType() != $7->getType()) + ThrowException("Select operand types must match!"); + $$ = ConstantExpr::getSelect($3, $5, $7); + } | BinaryOps '(' ConstVal ',' ConstVal ')' { if ($3->getType() != $5->getType()) ThrowException("Binary operator types must match!"); @@ -1802,6 +1809,13 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef { $$ = new CastInst($2, *$4); delete $4; } + | SELECT ResolvedVal ',' ResolvedVal ',' ResolvedVal { + if ($2->getType() != Type::BoolTy) + ThrowException("select condition must be boolean!"); + if ($4->getType() != $6->getType()) + ThrowException("select value types should match!"); + $$ = new SelectInst($2, $4, $6); + } | VA_ARG ResolvedVal ',' Types { // FIXME: This is emulation code for an obsolete syntax. This should be // removed at some point. |