From 03dcd3c6efa07bb4657c41bd167fca6c6e55a11c Mon Sep 17 00:00:00 2001 From: Alex Lorenz Date: Wed, 8 Jul 2015 21:23:34 +0000 Subject: [PATCH] MIR Serialization: Serialize the 'killed' register machine operand flag. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241734 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/MIRParser/MILexer.cpp | 1 + lib/CodeGen/MIRParser/MILexer.h | 4 +- lib/CodeGen/MIRParser/MIParser.cpp | 10 +++-- lib/CodeGen/MIRPrinter.cpp | 2 + test/CodeGen/MIR/X86/killed-register-flag.mir | 42 +++++++++++++++++++ 5 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 test/CodeGen/MIR/X86/killed-register-flag.mir diff --git a/lib/CodeGen/MIRParser/MILexer.cpp b/lib/CodeGen/MIRParser/MILexer.cpp index 2d11a057046..37e71edea4e 100644 --- a/lib/CodeGen/MIRParser/MILexer.cpp +++ b/lib/CodeGen/MIRParser/MILexer.cpp @@ -71,6 +71,7 @@ static MIToken::TokenKind getIdentifierKind(StringRef Identifier) { .Case("implicit", MIToken::kw_implicit) .Case("implicit-def", MIToken::kw_implicit_define) .Case("dead", MIToken::kw_dead) + .Case("killed", MIToken::kw_killed) .Default(MIToken::Identifier); } diff --git a/lib/CodeGen/MIRParser/MILexer.h b/lib/CodeGen/MIRParser/MILexer.h index 47c3c62b596..610a7b95b40 100644 --- a/lib/CodeGen/MIRParser/MILexer.h +++ b/lib/CodeGen/MIRParser/MILexer.h @@ -40,6 +40,7 @@ struct MIToken { kw_implicit, kw_implicit_define, kw_dead, + kw_killed, // Identifier tokens Identifier, @@ -75,7 +76,8 @@ public: } bool isRegisterFlag() const { - return Kind == kw_implicit || Kind == kw_implicit_define || Kind == kw_dead; + return Kind == kw_implicit || Kind == kw_implicit_define || + Kind == kw_dead || Kind == kw_killed; } bool is(TokenKind K) const { return Kind == K; } diff --git a/lib/CodeGen/MIRParser/MIParser.cpp b/lib/CodeGen/MIRParser/MIParser.cpp index 8eefe19a408..01e7d324a75 100644 --- a/lib/CodeGen/MIRParser/MIParser.cpp +++ b/lib/CodeGen/MIRParser/MIParser.cpp @@ -308,6 +308,9 @@ bool MIParser::parseRegisterFlag(unsigned &Flags) { case MIToken::kw_dead: Flags |= RegState::Dead; break; + case MIToken::kw_killed: + Flags |= RegState::Kill; + break; // TODO: report an error when we specify the same flag more than once. // TODO: parse the other register flags. default: @@ -330,9 +333,9 @@ bool MIParser::parseRegisterOperand(MachineOperand &Dest, bool IsDef) { return true; lex(); // TODO: Parse subregister. - Dest = MachineOperand::CreateReg(Reg, Flags & RegState::Define, - Flags & RegState::Implicit, /*IsKill=*/false, - Flags & RegState::Dead); + Dest = MachineOperand::CreateReg( + Reg, Flags & RegState::Define, Flags & RegState::Implicit, + Flags & RegState::Kill, Flags & RegState::Dead); return false; } @@ -417,6 +420,7 @@ bool MIParser::parseMachineOperand(MachineOperand &Dest) { case MIToken::kw_implicit: case MIToken::kw_implicit_define: case MIToken::kw_dead: + case MIToken::kw_killed: case MIToken::underscore: case MIToken::NamedRegister: return parseRegisterOperand(Dest); diff --git a/lib/CodeGen/MIRPrinter.cpp b/lib/CodeGen/MIRPrinter.cpp index a1f20f57251..e3b515b54cc 100644 --- a/lib/CodeGen/MIRPrinter.cpp +++ b/lib/CodeGen/MIRPrinter.cpp @@ -218,6 +218,8 @@ void MIPrinter::print(const MachineOperand &Op, const TargetRegisterInfo *TRI) { OS << (Op.isDef() ? "implicit-def " : "implicit "); if (Op.isDead()) OS << "dead "; + if (Op.isKill()) + OS << "killed "; printReg(Op.getReg(), OS, TRI); // TODO: Print sub register. break; diff --git a/test/CodeGen/MIR/X86/killed-register-flag.mir b/test/CodeGen/MIR/X86/killed-register-flag.mir new file mode 100644 index 00000000000..d654a9d2fa5 --- /dev/null +++ b/test/CodeGen/MIR/X86/killed-register-flag.mir @@ -0,0 +1,42 @@ +# RUN: llc -march=x86-64 -start-after branch-folder -stop-after branch-folder -o /dev/null %s | FileCheck %s +# This test ensures that the MIR parser parses the 'killed' register flags +# correctly. + +--- | + + define i32 @foo(i32 %a) { + entry: + %0 = icmp sle i32 %a, 10 + br i1 %0, label %less, label %exit + + less: + ret i32 0 + + exit: + ret i32 %a + } + +... +--- +name: foo +body: + - id: 0 + name: entry + instructions: + - 'CMP32ri8 %edi, 10, implicit-def %eflags' + - 'JG_1 %bb.2.exit, implicit %eflags' + - id: 1 + name: less + instructions: + # CHECK: - '%eax = MOV32r0 + # CHECK-NEXT: - 'RETQ killed %eax + - '%eax = MOV32r0 implicit-def %eflags' + - 'RETQ killed %eax' + - id: 2 + name: exit + instructions: + # CHECK: - '%eax = COPY killed %edi + # CHECK-NEXT: - 'RETQ killed %eax + - '%eax = COPY killed %edi' + - 'RETQ killed %eax' +... -- 2.34.1