[PATCH] MIR Serialization: Print and parse function's MBBs and simple MBB attributes.
Duncan P. N. Exon Smith
dexonsmith at apple.com
Wed Jun 17 15:07:56 PDT 2015
> On 2015 Jun 15, at 17:05, Alex Lorenz <arphaman at gmail.com> wrote:
>
> Hi dexonsmith, bob.wilson, bogner,
>
> This patch implements the initial serialization of the machine basic blocks in a machine function. Only the simple, scalar MBB attributes are serialized. The link to LLVM IR's basic block is preserved when that basic block has a name.
>
> REPOSITORY
> rL LLVM
>
> http://reviews.llvm.org/D10465
>
> Files:
> include/llvm/CodeGen/MIRYamlMapping.h
> lib/CodeGen/MIRParser/MIRParser.cpp
> lib/CodeGen/MIRPrinter.cpp
> test/CodeGen/MIR/basic-blocks.mir
>
> EMAIL PREFERENCES
> http://reviews.llvm.org/settings/panel/emailpreferences/
> <D10465.27730.patch>
> Index: lib/CodeGen/MIRParser/MIRParser.cpp
> ===================================================================
> --- lib/CodeGen/MIRParser/MIRParser.cpp
> +++ lib/CodeGen/MIRParser/MIRParser.cpp
> @@ -184,6 +191,14 @@
> new UnreachableInst(Context, BB);
> }
>
> +static const BasicBlock *findBasicBlock(const Function *Fn, StringRef Name) {
Can you take `Fn` by reference?
> + for (const BasicBlock &BB : Fn->getBasicBlockList()) {
> + if (Name == BB.getName())
> + return &BB;
Seems expensive. Aren't basic blocks stored in `Function`'s symbol
table? If so, the whole function should be:
return dyn_cast_or_null<BasicBlock>(Fn.getValueSymbolTable().lookup(Name)));
and maybe you don't need to separate this out at all (although it's fine
if you think it's cleaner).
> + }
> + return nullptr;
> +}
> +
> bool MIRParserImpl::initializeMachineFunction(MachineFunction &MF) {
> auto It = Functions.find(MF.getName());
> if (It == Functions.end())
> Index: lib/CodeGen/MIRPrinter.cpp
> ===================================================================
> --- lib/CodeGen/MIRPrinter.cpp
> +++ lib/CodeGen/MIRPrinter.cpp
> @@ -61,10 +64,27 @@
> YamlMF.Alignment = MF.getAlignment();
> YamlMF.ExposesReturnsTwice = MF.exposesReturnsTwice();
> YamlMF.HasInlineAsm = MF.hasInlineAsm();
> + for (const auto &MBB : MF) {
> + yaml::MachineBasicBlock YamlMBB;
> + convert(YamlMBB, MBB);
> + YamlMF.BasicBlocks.push_back(YamlMBB);
> + }
> yaml::Output Out(OS);
> Out << YamlMF;
> }
>
> +void MIRPrinter::convert(yaml::MachineBasicBlock &YamlMBB,
> + const MachineBasicBlock &MBB) {
> + const auto *BB = MBB.getBasicBlock();
> + if (BB && BB->hasName())
> + YamlMBB.Name = BB->getName();
> + else
> + YamlMBB.Name = "";
What if BB doesn't have a name? I guess it doesn't get serialized yet?
That's fine as a temporary missing feature, but I think you should
phrase it this way:
// FIXME: Track local value slots in functions so we can serialize
// machine basic blocks derived from unnamed LLVM IR basic blocks.
assert((!BB || BB->hasName()) &&
"No serialization support yet for unnamed basic blocks");
YamlMBB.Name = BB ? BB->getName() : "";
> + YamlMBB.Alignment = MBB.getAlignment();
> + YamlMBB.AddressTaken = MBB.hasAddressTaken();
> + YamlMBB.IsLandingPad = MBB.isLandingPad();
> +}
> +
> void llvm::printMIR(raw_ostream &OS, const Module &M) {
> yaml::Output Out(OS);
> Out << const_cast<Module &>(M);
More information about the llvm-commits
mailing list