From 1a5011df2dcfd832e2d3b972970a703c37cd3a01 Mon Sep 17 00:00:00 2001 From: Alexander Romanov Date: Sat, 16 Nov 2024 13:16:37 +0000 Subject: [PATCH] refactor: hide dummy block --- include/bleach/lifter/block-ir-builder.hpp | 2 +- lib/lifter/block-ir-builder.cpp | 26 +++++++++------------- test/lib/lifter/lifter.cpp | 4 +--- 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/include/bleach/lifter/block-ir-builder.hpp b/include/bleach/lifter/block-ir-builder.hpp index 8aba6ed..5ada881 100644 --- a/include/bleach/lifter/block-ir-builder.hpp +++ b/include/bleach/lifter/block-ir-builder.hpp @@ -67,6 +67,6 @@ struct basic_block { void copy_instructions(const MachineBasicBlock &src, MachineBasicBlock &dst); -basic_block clone_basic_block(MachineBasicBlock &src, BasicBlock &dummy); +basic_block clone_basic_block(MachineBasicBlock &src); } // namespace bleach::lifter diff --git a/lib/lifter/block-ir-builder.cpp b/lib/lifter/block-ir-builder.cpp index 6eeb781..75388e5 100644 --- a/lib/lifter/block-ir-builder.cpp +++ b/lib/lifter/block-ir-builder.cpp @@ -34,16 +34,20 @@ void copy_instructions(const MachineBasicBlock &src, MachineBasicBlock &dst) { } } -basic_block clone_basic_block(MachineBasicBlock &src, BasicBlock &dummy) { +basic_block clone_basic_block(MachineBasicBlock &src) { auto *mf = src.getParent(); assert(mf); auto &func = mf->getFunction(); auto *new_block = BasicBlock::Create(func.getContext(), "", &func); assert(new_block); - // FIXME: remove this + // Dummy basic block is necessary due to bug in + // MachineFunction::CreateMachineBasicBlock which dereferences nullptr if BB + // does not contain terminator. + // FIXME: remove after fix in upstream + auto *dummy_bb = BasicBlock::Create(func.getContext(), "dummy", &func); IRBuilder builder(func.getContext()); builder.SetInsertPoint(new_block); - builder.CreateBr(&dummy); + builder.CreateBr(dummy_bb); auto *new_mblock = mf->CreateMachineBasicBlock(new_block); assert(new_mblock); @@ -52,7 +56,8 @@ basic_block clone_basic_block(MachineBasicBlock &src, BasicBlock &dummy) { for (auto it = src.succ_begin(); it != src.succ_end(); ++it) new_mblock->copySuccessor(&src, it); - + assert(!new_block->empty()); + new_block->begin()->eraseFromParent(); return {new_mblock, new_block}; } @@ -64,15 +69,11 @@ void create_basic_blocks_for_mfunc(MachineFunction &mfunc, mbb2bb &m2b) { auto &func = mfunc.getFunction(); transform(func, std::back_inserter(blocks_to_erase), [](auto &bb) { return &bb; }); - // Dummy basic block is necessary due to bug in - // MachineFunction::CreateMachineBasicBlock which dereferences nullptr if BB - // does not contain terminator. - // FIXME: remove after fix in upstream - auto *dummy_bb = BasicBlock::Create(func.getContext(), "dummy", &func); + std::unordered_map block_map; // One cannot simply loop over mfunc as we insert new blocks into it for (auto *mbb : mblocks_to_erase) { - auto [new_mblock, new_block] = clone_basic_block(*mbb, *dummy_bb); + auto [new_mblock, new_block] = clone_basic_block(*mbb); m2b.insert({new_mblock, new_block}); block_map.insert({mbb, new_mblock}); } @@ -91,11 +92,6 @@ void create_basic_blocks_for_mfunc(MachineFunction &mfunc, mbb2bb &m2b) { } for (auto *bb : blocks_to_erase) bb->eraseFromParent(); - for (auto &bb : func) - for (auto &instr : make_early_inc_range(bb)) - if (auto *branch = dyn_cast(&instr)) - if (is_contained(branch->successors(), dummy_bb)) - instr.eraseFromParent(); } void fill_module_with_instrs(Module &m, const instr_impl &instrs) { diff --git a/test/lib/lifter/lifter.cpp b/test/lib/lifter/lifter.cpp index 734f16d..cc26b44 100644 --- a/test/lib/lifter/lifter.cpp +++ b/test/lib/lifter/lifter.cpp @@ -125,9 +125,7 @@ TEST(lifter_basic, clone_basic_block) { for (auto &f : *m) { auto &mf = machine_module_info->getOrCreateMachineFunction(f); for (auto &mbb : make_early_inc_range(mf)) { - auto *dummy_bb = BasicBlock::Create(ctx, "dummy", &f); - auto [copy_mbb, copy_bb] = - bleach::lifter::clone_basic_block(mbb, *dummy_bb); + auto [copy_mbb, copy_bb] = bleach::lifter::clone_basic_block(mbb); for (auto &&[inst, copy_inst] : zip(mbb, *copy_mbb)) { std::string str1; raw_string_ostream os1(str1);