From 01c1a5ee58a37ac2975615970561d8785252ba6e Mon Sep 17 00:00:00 2001 From: Alex Lorenz Date: Wed, 5 Aug 2015 17:49:03 +0000 Subject: [PATCH] MIR Serialization: Serialize the 'early-clobber' register operand flag. llvm-svn: 244075 --- llvm/lib/CodeGen/MIRParser/MILexer.cpp | 1 + llvm/lib/CodeGen/MIRParser/MILexer.h | 3 +- llvm/lib/CodeGen/MIRParser/MIParser.cpp | 6 ++- llvm/lib/CodeGen/MIRPrinter.cpp | 2 + .../MIR/X86/early-clobber-register-flag.mir | 46 ++++++++++++++++++++++ 5 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 llvm/test/CodeGen/MIR/X86/early-clobber-register-flag.mir diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.cpp b/llvm/lib/CodeGen/MIRParser/MILexer.cpp index 5134da9..13fad33 100644 --- a/llvm/lib/CodeGen/MIRParser/MILexer.cpp +++ b/llvm/lib/CodeGen/MIRParser/MILexer.cpp @@ -146,6 +146,7 @@ static MIToken::TokenKind getIdentifierKind(StringRef Identifier) { .Case("dead", MIToken::kw_dead) .Case("killed", MIToken::kw_killed) .Case("undef", MIToken::kw_undef) + .Case("early-clobber", MIToken::kw_early_clobber) .Case("debug-use", MIToken::kw_debug_use) .Case("frame-setup", MIToken::kw_frame_setup) .Case("debug-location", MIToken::kw_debug_location) diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.h b/llvm/lib/CodeGen/MIRParser/MILexer.h index 9a40349..14eb17a 100644 --- a/llvm/lib/CodeGen/MIRParser/MILexer.h +++ b/llvm/lib/CodeGen/MIRParser/MILexer.h @@ -47,6 +47,7 @@ struct MIToken { kw_dead, kw_killed, kw_undef, + kw_early_clobber, kw_debug_use, kw_frame_setup, kw_debug_location, @@ -120,7 +121,7 @@ public: bool isRegisterFlag() const { return Kind == kw_implicit || Kind == kw_implicit_define || Kind == kw_dead || Kind == kw_killed || Kind == kw_undef || - Kind == kw_debug_use; + Kind == kw_early_clobber || Kind == kw_debug_use; } bool isMemoryOperandFlag() const { return Kind == kw_volatile; } diff --git a/llvm/lib/CodeGen/MIRParser/MIParser.cpp b/llvm/lib/CodeGen/MIRParser/MIParser.cpp index 7b9e45e..7f42013 100644 --- a/llvm/lib/CodeGen/MIRParser/MIParser.cpp +++ b/llvm/lib/CodeGen/MIRParser/MIParser.cpp @@ -490,6 +490,9 @@ bool MIParser::parseRegisterFlag(unsigned &Flags) { case MIToken::kw_undef: Flags |= RegState::Undef; break; + case MIToken::kw_early_clobber: + Flags |= RegState::EarlyClobber; + break; case MIToken::kw_debug_use: Flags |= RegState::Debug; break; @@ -535,7 +538,7 @@ bool MIParser::parseRegisterOperand(MachineOperand &Dest, bool IsDef) { Dest = MachineOperand::CreateReg( Reg, Flags & RegState::Define, Flags & RegState::Implicit, Flags & RegState::Kill, Flags & RegState::Dead, Flags & RegState::Undef, - /*isEarlyClobber=*/false, SubReg, Flags & RegState::Debug); + Flags & RegState::EarlyClobber, SubReg, Flags & RegState::Debug); return false; } @@ -885,6 +888,7 @@ bool MIParser::parseMachineOperand(MachineOperand &Dest) { case MIToken::kw_dead: case MIToken::kw_killed: case MIToken::kw_undef: + case MIToken::kw_early_clobber: case MIToken::kw_debug_use: case MIToken::underscore: case MIToken::NamedRegister: diff --git a/llvm/lib/CodeGen/MIRPrinter.cpp b/llvm/lib/CodeGen/MIRPrinter.cpp index 2eb5cbf..bba9518 100644 --- a/llvm/lib/CodeGen/MIRPrinter.cpp +++ b/llvm/lib/CodeGen/MIRPrinter.cpp @@ -529,6 +529,8 @@ void MIPrinter::print(const MachineOperand &Op, const TargetRegisterInfo *TRI) { OS << "killed "; if (Op.isUndef()) OS << "undef "; + if (Op.isEarlyClobber()) + OS << "early-clobber "; if (Op.isDebug()) OS << "debug-use "; printReg(Op.getReg(), OS, TRI); diff --git a/llvm/test/CodeGen/MIR/X86/early-clobber-register-flag.mir b/llvm/test/CodeGen/MIR/X86/early-clobber-register-flag.mir new file mode 100644 index 0000000..ce2e509 --- /dev/null +++ b/llvm/test/CodeGen/MIR/X86/early-clobber-register-flag.mir @@ -0,0 +1,46 @@ +# 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 'early-clobber' register +# flags correctly. + +--- | + + declare void @foo(i32) + + define void @test(i32 %a, i32 %b) #0 { + entry: + %c = add i32 %a, %b + call void asm sideeffect "nop", "~{ax},~{di}"() + call void @foo(i32 %c) + ret void + } + + attributes #0 = { optsize } + +... +--- +name: test +hasInlineAsm: true +tracksRegLiveness: true +liveins: + - { reg: '%edi' } + - { reg: '%esi' } +frameInfo: + stackSize: 8 + adjustsStack: true + hasCalls: true +body: + - id: 0 + name: entry + liveins: [ '%edi', '%esi' ] + instructions: + - 'frame-setup PUSH64r undef %rax, implicit-def %rsp, implicit %rsp' + - CFI_INSTRUCTION .cfi_def_cfa_offset 16 + - '%ecx = COPY %edi' + - '%ecx = ADD32rr killed %ecx, killed %esi, implicit-def dead %eflags' +# CHECK: INLINEASM $nop, 1, 12, implicit-def dead early-clobber %ax, 12, implicit-def dead early-clobber %di + - 'INLINEASM $nop, 1, 12, implicit-def dead early-clobber %ax, 12, implicit-def dead early-clobber %di' + - '%edi = COPY killed %ecx' + - 'CALL64pcrel32 @foo, csr_64, implicit %rsp, implicit %edi, implicit-def %rsp' + - '%rax = POP64r implicit-def %rsp, implicit %rsp' + - RETQ +... -- 2.7.4