Skip to content

Commit

Permalink
MIRParser: Add %subreg.xxx syntax for subregister index operands
Browse files Browse the repository at this point in the history
Differential Revision: http://reviews.llvm.org/D18279

llvm-svn: 264608
  • Loading branch information
MatzeB committed Mar 28, 2016
1 parent 2bd8eeb commit b74eb41
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 1 deletion.
11 changes: 11 additions & 0 deletions llvm/lib/CodeGen/MIRParser/MILexer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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.";
Expand Down Expand Up @@ -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))
Expand Down
3 changes: 2 additions & 1 deletion llvm/lib/CodeGen/MIRParser/MILexer.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,8 @@ struct MIToken {
IRBlock,
NamedIRValue,
IRValue,
QuotedIRValue // `<constant value>`
QuotedIRValue, // `<constant value>`
SubRegisterIndex
};

private:
Expand Down
14 changes: 14 additions & 0 deletions llvm/lib/CodeGen/MIRParser/MIParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@ class MIParser {
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);
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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:
Expand Down
32 changes: 32 additions & 0 deletions llvm/test/CodeGen/MIR/X86/subregister-index-operands.mir
Original file line number Diff line number Diff line change
@@ -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
...

26 changes: 26 additions & 0 deletions llvm/test/CodeGen/MIR/X86/unknown-subregister-index-op.mir
Original file line number Diff line number Diff line change
@@ -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
...

0 comments on commit b74eb41

Please sign in to comment.