From c338a581fd1572c0b69c14bae34b034fc5e120cb Mon Sep 17 00:00:00 2001 From: Alex Lorenz Date: Wed, 12 Aug 2015 21:23:17 +0000 Subject: [PATCH] MIR Serialization: Serialize the fixed stack pseudo source values. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@244816 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/MIRParser/MIParser.cpp | 11 ++++- lib/CodeGen/MIRPrinter.cpp | 4 ++ .../MIR/X86/fixed-stack-memory-operands.mir | 41 +++++++++++++++++++ 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 test/CodeGen/MIR/X86/fixed-stack-memory-operands.mir diff --git a/lib/CodeGen/MIRParser/MIParser.cpp b/lib/CodeGen/MIRParser/MIParser.cpp index 2f106f201e0..b6c39399471 100644 --- a/lib/CodeGen/MIRParser/MIParser.cpp +++ b/lib/CodeGen/MIRParser/MIParser.cpp @@ -1142,6 +1142,14 @@ bool MIParser::parseMemoryPseudoSourceValue(const PseudoSourceValue *&PSV) { case MIToken::kw_constant_pool: PSV = MF.getPSVManager().getConstantPool(); break; + case MIToken::FixedStackObject: { + int FI; + if (parseFixedStackFrameIndex(FI)) + return true; + PSV = MF.getPSVManager().getFixedStack(FI); + // The token was already consumed, so use return here instead of break. + return false; + } // TODO: Parse the other pseudo source values. default: llvm_unreachable("The current token should be pseudo source value"); @@ -1152,7 +1160,8 @@ bool MIParser::parseMemoryPseudoSourceValue(const PseudoSourceValue *&PSV) { bool MIParser::parseMachinePointerInfo(MachinePointerInfo &Dest) { if (Token.is(MIToken::kw_constant_pool) || Token.is(MIToken::kw_stack) || - Token.is(MIToken::kw_got) || Token.is(MIToken::kw_jump_table)) { + Token.is(MIToken::kw_got) || Token.is(MIToken::kw_jump_table) || + Token.is(MIToken::FixedStackObject)) { const PseudoSourceValue *PSV = nullptr; if (parseMemoryPseudoSourceValue(PSV)) return true; diff --git a/lib/CodeGen/MIRPrinter.cpp b/lib/CodeGen/MIRPrinter.cpp index 367626a6e10..24b895cadbd 100644 --- a/lib/CodeGen/MIRPrinter.cpp +++ b/lib/CodeGen/MIRPrinter.cpp @@ -722,6 +722,10 @@ void MIPrinter::print(const MachineMemOperand &Op) { case PseudoSourceValue::ConstantPool: OS << "constant-pool"; break; + case PseudoSourceValue::FixedStack: + printStackObjectReference( + cast(PVal)->getFrameIndex()); + break; default: // TODO: Print the other pseudo source values. OS << ""; diff --git a/test/CodeGen/MIR/X86/fixed-stack-memory-operands.mir b/test/CodeGen/MIR/X86/fixed-stack-memory-operands.mir new file mode 100644 index 00000000000..8c9bce4044b --- /dev/null +++ b/test/CodeGen/MIR/X86/fixed-stack-memory-operands.mir @@ -0,0 +1,41 @@ +# RUN: llc -march=x86 -start-after branch-folder -stop-after branch-folder -o /dev/null %s | FileCheck %s +# This test ensures that the MIR parser parses fixed stack memory operands +# correctly. + +--- | + + define i32 @test(i32 %a) #0 { + entry: + %b = alloca i32 + store i32 %a, i32* %b + %c = load i32, i32* %b + ret i32 %c + } + + attributes #0 = { "no-frame-pointer-elim"="false" } + +... +--- +name: test +alignment: 4 +tracksRegLiveness: true +frameInfo: + stackSize: 4 + maxAlignment: 4 +fixedStack: + - { id: 0, offset: 0, size: 4, alignment: 16, isImmutable: true } +stack: + - { id: 0, name: b, offset: -8, size: 4, alignment: 4 } +body: + - id: 0 + name: entry + instructions: + - 'frame-setup PUSH32r undef %eax, implicit-def %esp, implicit %esp' + - CFI_INSTRUCTION .cfi_def_cfa_offset 8 +# CHECK: name: test +# CHECK: %eax = MOV32rm %esp, 1, _, 8, _ :: (load 4 from %fixed-stack.0, align 16) + - '%eax = MOV32rm %esp, 1, _, 8, _ :: (load 4 from %fixed-stack.0, align 16)' + - 'MOV32mr %esp, 1, _, 0, _, %eax :: (store 4 into %ir.b)' + - '%edx = POP32r implicit-def %esp, implicit %esp' + - 'RETL %eax' +... -- 2.34.1