From: Alex Lorenz Date: Wed, 19 Aug 2015 23:31:05 +0000 (+0000) Subject: MIR Serialization: Serialize unnamed local IR values in memory operands. X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=e8a419727a1cf879254f2dc5b1cf862505fcb115 MIR Serialization: Serialize unnamed local IR values in memory operands. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@245521 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/MIRParser/MILexer.cpp b/lib/CodeGen/MIRParser/MILexer.cpp index 94f38e48281..6094ca996bf 100644 --- a/lib/CodeGen/MIRParser/MILexer.cpp +++ b/lib/CodeGen/MIRParser/MILexer.cpp @@ -342,6 +342,8 @@ static Cursor maybeLexIRValue( const StringRef Rule = "%ir."; if (!C.remaining().startswith(Rule)) return None; + if (isdigit(C.peek(Rule.size()))) + return maybeLexIndex(C, Token, Rule, MIToken::IRValue); return lexName(C, Token, MIToken::NamedIRValue, Rule.size(), ErrorCallback); } diff --git a/lib/CodeGen/MIRParser/MILexer.h b/lib/CodeGen/MIRParser/MILexer.h index 55479b8c54d..17ddc4d5c1a 100644 --- a/lib/CodeGen/MIRParser/MILexer.h +++ b/lib/CodeGen/MIRParser/MILexer.h @@ -114,6 +114,7 @@ struct MIToken { NamedIRBlock, IRBlock, NamedIRValue, + IRValue }; private: @@ -175,7 +176,7 @@ public: Kind == MachineBasicBlockLabel || Kind == StackObject || Kind == FixedStackObject || Kind == GlobalValue || Kind == VirtualRegister || Kind == ConstantPoolItem || - Kind == JumpTableIndex || Kind == IRBlock; + Kind == JumpTableIndex || Kind == IRBlock || Kind == IRValue; } }; diff --git a/lib/CodeGen/MIRParser/MIParser.cpp b/lib/CodeGen/MIRParser/MIParser.cpp index 4dfa793e730..80f6a654b97 100644 --- a/lib/CodeGen/MIRParser/MIParser.cpp +++ b/lib/CodeGen/MIRParser/MIParser.cpp @@ -73,6 +73,8 @@ class MIParser { StringMap Names2SubRegIndices; /// Maps from slot numbers to function's unnamed basic blocks. DenseMap Slots2BasicBlocks; + /// Maps from slot numbers to function's unnamed values. + DenseMap Slots2Values; /// Maps from target index names to target indices. StringMap Names2TargetIndices; /// Maps from direct target flag names to the direct target flag values. @@ -212,6 +214,8 @@ private: const BasicBlock *getIRBlock(unsigned Slot); const BasicBlock *getIRBlock(unsigned Slot, const Function &F); + const Value *getIRValue(unsigned Slot); + void initNames2TargetIndices(); /// Try to convert a name of target index to the corresponding target index. @@ -1530,14 +1534,20 @@ bool MIParser::parseIRValue(const Value *&V) { if (!V) V = MF.getFunction()->getParent()->getValueSymbolTable().lookup( Token.stringValue()); - if (!V) - return error(Twine("use of undefined IR value '") + Token.range() + "'"); break; } - // TODO: Parse unnamed IR value references. + case MIToken::IRValue: { + unsigned SlotNumber = 0; + if (getUnsigned(SlotNumber)) + return true; + V = getIRValue(SlotNumber); + break; + } default: llvm_unreachable("The current token should be an IR block reference"); } + if (!V) + return error(Twine("use of undefined IR value '") + Token.range() + "'"); return false; } @@ -1629,7 +1639,7 @@ bool MIParser::parseMachinePointerInfo(MachinePointerInfo &Dest) { Dest = MachinePointerInfo(PSV, Offset); return false; } - if (Token.isNot(MIToken::NamedIRValue)) + if (Token.isNot(MIToken::NamedIRValue) && Token.isNot(MIToken::IRValue)) return error("expected an IR value reference"); const Value *V = nullptr; if (parseIRValue(V)) @@ -1837,6 +1847,37 @@ const BasicBlock *MIParser::getIRBlock(unsigned Slot, const Function &F) { return getIRBlockFromSlot(Slot, CustomSlots2BasicBlocks); } +static void mapValueToSlot(const Value *V, ModuleSlotTracker &MST, + DenseMap &Slots2Values) { + int Slot = MST.getLocalSlot(V); + if (Slot == -1) + return; + Slots2Values.insert(std::make_pair(unsigned(Slot), V)); +} + +/// Creates the mapping from slot numbers to function's unnamed IR values. +static void initSlots2Values(const Function &F, + DenseMap &Slots2Values) { + ModuleSlotTracker MST(F.getParent(), /*ShouldInitializeAllMetadata=*/false); + MST.incorporateFunction(F); + for (const auto &Arg : F.args()) + mapValueToSlot(&Arg, MST, Slots2Values); + for (const auto &BB : F) { + mapValueToSlot(&BB, MST, Slots2Values); + for (const auto &I : BB) + mapValueToSlot(&I, MST, Slots2Values); + } +} + +const Value *MIParser::getIRValue(unsigned Slot) { + if (Slots2Values.empty()) + initSlots2Values(*MF.getFunction(), Slots2Values); + auto ValueInfo = Slots2Values.find(Slot); + if (ValueInfo == Slots2Values.end()) + return nullptr; + return ValueInfo->second; +} + void MIParser::initNames2TargetIndices() { if (!Names2TargetIndices.empty()) return; diff --git a/lib/CodeGen/MIRPrinter.cpp b/lib/CodeGen/MIRPrinter.cpp index df2f441a031..e9ecba404b6 100644 --- a/lib/CodeGen/MIRPrinter.cpp +++ b/lib/CodeGen/MIRPrinter.cpp @@ -608,13 +608,13 @@ void MIPrinter::printIRBlockReference(const BasicBlock &BB) { } void MIPrinter::printIRValueReference(const Value &V) { + // TODO: Global values should use the '@' syntax. OS << "%ir."; if (V.hasName()) { printLLVMNameWithoutPrefix(OS, V.getName()); return; } - // TODO: Serialize the unnamed IR value references. - OS << ""; + printIRSlotNumber(OS, MST.getLocalSlot(&V)); } void MIPrinter::printStackObjectReference(int FrameIndex) { diff --git a/test/CodeGen/MIR/X86/memory-operands.mir b/test/CodeGen/MIR/X86/memory-operands.mir index fabea5ebcbf..ba5bcec820e 100644 --- a/test/CodeGen/MIR/X86/memory-operands.mir +++ b/test/CodeGen/MIR/X86/memory-operands.mir @@ -19,6 +19,15 @@ ret void } + define void @test3(i32*) { + entry3: + %1 = alloca i32 + %b = load i32, i32* %0 + %c = add i32 %b, 1 + store i32 %c, i32* %1 + ret void + } + define i32 @volatile_inc(i32* %x) { entry: %0 = load volatile i32, i32* %x @@ -185,6 +194,27 @@ body: | RETQ ... --- +name: test3 +tracksRegLiveness: true +liveins: + - { reg: '%rdi' } +frameInfo: + maxAlignment: 4 +stack: + - { id: 0, offset: -12, size: 4, alignment: 4 } +body: | + bb.0.entry3: + liveins: %rdi + ; Verify that the unnamed local values can be serialized. + ; CHECK-LABEL: name: test3 + ; CHECK: %eax = MOV32rm killed %rdi, 1, _, 0, _ :: (load 4 from %ir.0) + ; CHECK: MOV32mr %rsp, 1, _, -4, _, killed %eax :: (store 4 into %ir.1) + %eax = MOV32rm killed %rdi, 1, _, 0, _ :: (load 4 from %ir.0) + %eax = INC32r killed %eax, implicit-def dead %eflags + MOV32mr %rsp, 1, _, -4, _, killed %eax :: (store 4 into %ir.1) + RETQ +... +--- name: volatile_inc tracksRegLiveness: true liveins: