diff options
author | Alex Lorenz <arphaman@gmail.com> | 2015-08-10 23:24:42 +0000 |
---|---|---|
committer | Alex Lorenz <arphaman@gmail.com> | 2015-08-10 23:24:42 +0000 |
commit | b97c9ef4d0d7ff23c12b3ab9cfac68c6be3b32a1 (patch) | |
tree | d26de9f85534ee128b63be8b889e804a305b348a /llvm/lib | |
parent | d967a878fab52807fe38d47bbe711ebf26d6f49f (diff) | |
download | bcm5719-llvm-b97c9ef4d0d7ff23c12b3ab9cfac68c6be3b32a1.tar.gz bcm5719-llvm-b97c9ef4d0d7ff23c12b3ab9cfac68c6be3b32a1.zip |
MIR Serialization: Serialize the liveout register mask machine operands.
llvm-svn: 244529
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/CodeGen/MIRParser/MILexer.cpp | 1 | ||||
-rw-r--r-- | llvm/lib/CodeGen/MIRParser/MILexer.h | 1 | ||||
-rw-r--r-- | llvm/lib/CodeGen/MIRParser/MIParser.cpp | 30 | ||||
-rw-r--r-- | llvm/lib/CodeGen/MIRPrinter.cpp | 15 |
4 files changed, 47 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.cpp b/llvm/lib/CodeGen/MIRParser/MILexer.cpp index f8640de8f6f..c59d78062b7 100644 --- a/llvm/lib/CodeGen/MIRParser/MILexer.cpp +++ b/llvm/lib/CodeGen/MIRParser/MILexer.cpp @@ -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); } diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.h b/llvm/lib/CodeGen/MIRParser/MILexer.h index 8448c228a7f..831a21b2c41 100644 --- a/llvm/lib/CodeGen/MIRParser/MILexer.h +++ b/llvm/lib/CodeGen/MIRParser/MILexer.h @@ -70,6 +70,7 @@ struct MIToken { kw_non_temporal, kw_invariant, kw_align, + kw_liveout, // Identifier tokens Identifier, diff --git a/llvm/lib/CodeGen/MIRParser/MIParser.cpp b/llvm/lib/CodeGen/MIRParser/MIParser.cpp index fe39d157297..cfdd58874fb 100644 --- a/llvm/lib/CodeGen/MIRParser/MIParser.cpp +++ b/llvm/lib/CodeGen/MIRParser/MIParser.cpp @@ -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: diff --git a/llvm/lib/CodeGen/MIRPrinter.cpp b/llvm/lib/CodeGen/MIRPrinter.cpp index 6327ff28ba8..c12b2cfeacc 100644 --- a/llvm/lib/CodeGen/MIRPrinter.cpp +++ b/llvm/lib/CodeGen/MIRPrinter.cpp @@ -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; |