diff options
| author | Matthias Braun <matze@braunis.de> | 2016-03-28 18:18:46 +0000 |
|---|---|---|
| committer | Matthias Braun <matze@braunis.de> | 2016-03-28 18:18:46 +0000 |
| commit | b74eb41d581316beaadbc08d0b3c7541d0287372 (patch) | |
| tree | 5729361f09da3f5b04a7053b3683ea2ecd2037bc | |
| parent | 2bd8eeb6b7ab8b39a884f37cd24e7373f5f0ea35 (diff) | |
| download | bcm5719-llvm-b74eb41d581316beaadbc08d0b3c7541d0287372.tar.gz bcm5719-llvm-b74eb41d581316beaadbc08d0b3c7541d0287372.zip | |
MIRParser: Add %subreg.xxx syntax for subregister index operands
Differential Revision: http://reviews.llvm.org/D18279
llvm-svn: 264608
| -rw-r--r-- | llvm/lib/CodeGen/MIRParser/MILexer.cpp | 11 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/MIRParser/MILexer.h | 3 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/MIRParser/MIParser.cpp | 14 | ||||
| -rw-r--r-- | llvm/test/CodeGen/MIR/X86/subregister-index-operands.mir | 32 | ||||
| -rw-r--r-- | llvm/test/CodeGen/MIR/X86/unknown-subregister-index-op.mir | 26 |
5 files changed, 85 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.cpp b/llvm/lib/CodeGen/MIRParser/MILexer.cpp index 2a6db07bc4b..b1131615cbf 100644 --- a/llvm/lib/CodeGen/MIRParser/MILexer.cpp +++ b/llvm/lib/CodeGen/MIRParser/MILexer.cpp @@ -325,6 +325,15 @@ static Cursor maybeLexConstantPoolItem(Cursor C, MIToken &Token) { return maybeLexIndex(C, Token, "%const.", MIToken::ConstantPoolItem); } +static Cursor maybeLexSubRegisterIndex(Cursor C, MIToken &Token, + ErrorCallbackType ErrorCallback) { + const StringRef Rule = "%subreg."; + if (!C.remaining().startswith(Rule)) + return None; + return lexName(C, Token, MIToken::SubRegisterIndex, Rule.size(), + ErrorCallback); +} + static Cursor maybeLexIRBlock(Cursor C, MIToken &Token, ErrorCallbackType ErrorCallback) { const StringRef Rule = "%ir-block."; @@ -570,6 +579,8 @@ StringRef llvm::lexMIToken(StringRef Source, MIToken &Token, return R.remaining(); if (Cursor R = maybeLexConstantPoolItem(C, Token)) return R.remaining(); + if (Cursor R = maybeLexSubRegisterIndex(C, Token, ErrorCallback)) + return R.remaining(); if (Cursor R = maybeLexIRBlock(C, Token, ErrorCallback)) return R.remaining(); if (Cursor R = maybeLexIRValue(C, Token, ErrorCallback)) diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.h b/llvm/lib/CodeGen/MIRParser/MILexer.h index ddf5e9f7c10..32fc8ab271e 100644 --- a/llvm/lib/CodeGen/MIRParser/MILexer.h +++ b/llvm/lib/CodeGen/MIRParser/MILexer.h @@ -118,7 +118,8 @@ struct MIToken { IRBlock, NamedIRValue, IRValue, - QuotedIRValue // `<constant value>` + QuotedIRValue, // `<constant value>` + SubRegisterIndex }; private: diff --git a/llvm/lib/CodeGen/MIRParser/MIParser.cpp b/llvm/lib/CodeGen/MIRParser/MIParser.cpp index 141aeb57349..8c7345111c5 100644 --- a/llvm/lib/CodeGen/MIRParser/MIParser.cpp +++ b/llvm/lib/CodeGen/MIRParser/MIParser.cpp @@ -144,6 +144,7 @@ public: bool parseGlobalValue(GlobalValue *&GV); bool parseGlobalAddressOperand(MachineOperand &Dest); bool parseConstantPoolIndexOperand(MachineOperand &Dest); + bool parseSubRegisterIndexOperand(MachineOperand &Dest); bool parseJumpTableIndexOperand(MachineOperand &Dest); bool parseExternalSymbolOperand(MachineOperand &Dest); bool parseMDNode(MDNode *&Node); @@ -1237,6 +1238,17 @@ bool MIParser::parseExternalSymbolOperand(MachineOperand &Dest) { return false; } +bool MIParser::parseSubRegisterIndexOperand(MachineOperand &Dest) { + assert(Token.is(MIToken::SubRegisterIndex)); + StringRef Name = Token.stringValue(); + unsigned SubRegIndex = getSubRegIndex(Token.stringValue()); + if (SubRegIndex == 0) + return error(Twine("unknown subregister index '") + Name + "'"); + lex(); + Dest = MachineOperand::CreateImm(SubRegIndex); + return false; +} + bool MIParser::parseMDNode(MDNode *&Node) { assert(Token.is(MIToken::exclaim)); auto Loc = Token.location(); @@ -1482,6 +1494,8 @@ bool MIParser::parseMachineOperand(MachineOperand &Dest, return parseJumpTableIndexOperand(Dest); case MIToken::ExternalSymbol: return parseExternalSymbolOperand(Dest); + case MIToken::SubRegisterIndex: + return parseSubRegisterIndexOperand(Dest); case MIToken::exclaim: return parseMetadataOperand(Dest); case MIToken::kw_cfi_same_value: diff --git a/llvm/test/CodeGen/MIR/X86/subregister-index-operands.mir b/llvm/test/CodeGen/MIR/X86/subregister-index-operands.mir new file mode 100644 index 00000000000..823fcd582df --- /dev/null +++ b/llvm/test/CodeGen/MIR/X86/subregister-index-operands.mir @@ -0,0 +1,32 @@ +# RUN: llc -march=x86-64 -start-after machine-sink -stop-after machine-sink -o /dev/null %s 2>&1 | FileCheck %s +# This test ensures that the MIR parser parses and prints subregisters index +# operands correctly. + +--- | + + define zeroext i1 @t(i1 %c) { + entry: + ret i1 %c + } + +... +--- +# CHECK-LABEL: name: t +# CHECK: %0 = INSERT_SUBREG %edi, %al, {{[0-9]+}} +# CHECK: %1 = EXTRACT_SUBREG %eax, {{[0-9]+}} +# CHECK: %ax = REG_SEQUENCE %1, {{[0-9]+}}, %1, {{[0-9]+}} +name: t +isSSA: true +tracksRegLiveness: true +registers: + - { id: 0, class: gr32 } + - { id: 1, class: gr8 } +body: | + bb.0.entry: + liveins: %edi, %eax + %0 = INSERT_SUBREG %edi, %al, %subreg.sub_8bit + %1 = EXTRACT_SUBREG %eax, %subreg.sub_8bit_hi + %ax = REG_SEQUENCE %1, %subreg.sub_8bit, %1, %subreg.sub_8bit_hi + RETQ %ax +... + diff --git a/llvm/test/CodeGen/MIR/X86/unknown-subregister-index-op.mir b/llvm/test/CodeGen/MIR/X86/unknown-subregister-index-op.mir new file mode 100644 index 00000000000..fa7e1ada932 --- /dev/null +++ b/llvm/test/CodeGen/MIR/X86/unknown-subregister-index-op.mir @@ -0,0 +1,26 @@ +# RUN: not llc -march=x86-64 -start-after machine-sink -stop-after machine-sink -o /dev/null %s 2>&1 | FileCheck %s +# This test ensures that an error is reported when an unknown subregister index +# is encountered. + +--- | + + define zeroext i1 @t(i1 %c) { + entry: + ret i1 %c + } + +... +--- +name: t +isSSA: true +tracksRegLiveness: true +registers: + - { id: 0, class: gr32 } + - { id: 1, class: gr8 } + - { id: 2, class: gr8 } +body: | + bb.0.entry: + ; CHECK: [[@LINE+1]]:35: unknown subregister index 'bit8' + %0 = INSERT_SUBREG %edi, %al, %subreg.bit8 + RETQ %0 +... |

