1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-18 18:42:46 +02:00

MIR Serialization: Serialize the liveout register mask machine operands.

llvm-svn: 244529
This commit is contained in:
Alex Lorenz 2015-08-10 23:24:42 +00:00
parent 2ea34a4b40
commit 3b5305d636
5 changed files with 90 additions and 0 deletions

View File

@ -201,6 +201,7 @@ static MIToken::TokenKind getIdentifierKind(StringRef Identifier) {
.Case("non-temporal", MIToken::kw_non_temporal)
.Case("invariant", MIToken::kw_invariant)
.Case("align", MIToken::kw_align)
.Case("liveout", MIToken::kw_liveout)
.Default(MIToken::Identifier);
}

View File

@ -70,6 +70,7 @@ struct MIToken {
kw_non_temporal,
kw_invariant,
kw_align,
kw_liveout,
// Identifier tokens
Identifier,

View File

@ -121,6 +121,7 @@ public:
bool parseIRBlock(BasicBlock *&BB, const Function &F);
bool parseBlockAddressOperand(MachineOperand &Dest);
bool parseTargetIndexOperand(MachineOperand &Dest);
bool parseLiveoutRegisterMaskOperand(MachineOperand &Dest);
bool parseMachineOperand(MachineOperand &Dest);
bool parseMachineOperandAndTargetFlags(MachineOperand &Dest);
bool parseOffset(int64_t &Offset);
@ -920,6 +921,33 @@ bool MIParser::parseTargetIndexOperand(MachineOperand &Dest) {
return false;
}
bool MIParser::parseLiveoutRegisterMaskOperand(MachineOperand &Dest) {
assert(Token.is(MIToken::kw_liveout));
const auto *TRI = MF.getSubtarget().getRegisterInfo();
assert(TRI && "Expected target register info");
uint32_t *Mask = MF.allocateRegisterMask(TRI->getNumRegs());
lex();
if (expectAndConsume(MIToken::lparen))
return true;
while (true) {
if (Token.isNot(MIToken::NamedRegister))
return error("expected a named register");
unsigned Reg = 0;
if (parseRegister(Reg))
return true;
lex();
Mask[Reg / 32] |= 1U << (Reg % 32);
// TODO: Report an error if the same register is used more than once.
if (Token.isNot(MIToken::comma))
break;
lex();
}
if (expectAndConsume(MIToken::rparen))
return true;
Dest = MachineOperand::CreateRegLiveOut(Mask);
return false;
}
bool MIParser::parseMachineOperand(MachineOperand &Dest) {
switch (Token.kind()) {
case MIToken::kw_implicit:
@ -970,6 +998,8 @@ bool MIParser::parseMachineOperand(MachineOperand &Dest) {
return parseBlockAddressOperand(Dest);
case MIToken::kw_target_index:
return parseTargetIndexOperand(Dest);
case MIToken::kw_liveout:
return parseLiveoutRegisterMaskOperand(Dest);
case MIToken::Error:
return true;
case MIToken::Identifier:

View File

@ -645,6 +645,21 @@ void MIPrinter::print(const MachineOperand &Op, const TargetRegisterInfo *TRI) {
llvm_unreachable("Can't print this machine register mask yet.");
break;
}
case MachineOperand::MO_RegisterLiveOut: {
const uint32_t *RegMask = Op.getRegLiveOut();
OS << "liveout(";
bool IsCommaNeeded = false;
for (unsigned Reg = 0, E = TRI->getNumRegs(); Reg < E; ++Reg) {
if (RegMask[Reg / 32] & (1U << (Reg % 32))) {
if (IsCommaNeeded)
OS << ", ";
printReg(Reg, OS, TRI);
IsCommaNeeded = true;
}
}
OS << ")";
break;
}
case MachineOperand::MO_Metadata:
Op.getMetadata()->printAsOperand(OS, MST);
break;

View File

@ -0,0 +1,43 @@
# RUN: llc -march=x86-64 -start-after stackmap-liveness -stop-after stackmap-liveness -o /dev/null %s | FileCheck %s
# This test ensures that the MIR parser parses the liveout register mask
# machine operands correctly.
--- |
define void @small_patchpoint_codegen(i64 %p1, i64 %p2, i64 %p3, i64 %p4) {
entry:
%result = tail call i64 (i64, i32, i8*, i32, ...) @llvm.experimental.patchpoint.i64(i64 5, i32 5, i8* null, i32 2, i64 %p1, i64 %p2)
ret void
}
declare i64 @llvm.experimental.patchpoint.i64(i64, i32, i8*, i32, ...)
...
---
name: small_patchpoint_codegen
tracksRegLiveness: true
liveins:
- { reg: '%rdi' }
- { reg: '%rsi' }
frameInfo:
hasPatchPoint: true
stackSize: 8
adjustsStack: true
hasCalls: true
fixedStack:
- { id: 0, type: spill-slot, offset: -16, size: 8, alignment: 16 }
body:
- id: 0
name: entry
liveins: [ '%rdi', '%rsi', '%rbp' ]
instructions:
- 'frame-setup PUSH64r killed %rbp, implicit-def %rsp, implicit %rsp'
- CFI_INSTRUCTION .cfi_def_cfa_offset 16
- 'CFI_INSTRUCTION .cfi_offset %rbp, -16'
- '%rbp = frame-setup MOV64rr %rsp'
- 'CFI_INSTRUCTION .cfi_def_cfa_register %rbp'
# CHECK: PATCHPOINT 5, 5, 0, 2, 0, %rdi, %rsi, csr_64, liveout(%esp, %rsp, %sp, %spl),
- 'PATCHPOINT 5, 5, 0, 2, 0, %rdi, %rsi, csr_64, liveout(%esp, %rsp, %sp, %spl), implicit-def dead early-clobber %r11, implicit-def %rsp, implicit-def dead %rax'
- '%rbp = POP64r implicit-def %rsp, implicit %rsp'
- RETQ
...