add_jump (if_block, then_start_block);
add_jump (if_block, final_block);
- auto &then_end_bb = ctx.basic_blocks[then_end_block.value];
+ auto &then_end_bb = ctx.basic_blocks[then_end_block];
if (then_end_bb.is_goto_terminated () && then_end_bb.successors.empty ())
add_jump (then_end_block, final_block);
}
add_jump (if_end_bb, then_start_bb);
add_jump (if_end_bb, else_start_bb);
- auto &then_bb = ctx.basic_blocks[then_end_bb.value];
+ auto &then_bb = ctx.basic_blocks[then_end_bb];
if (then_bb.is_goto_terminated () && then_bb.successors.empty ())
add_jump (then_end_bb, final_start_bb);
- auto &else_bb = ctx.basic_blocks[else_end_bb.value];
+ auto &else_bb = ctx.basic_blocks[else_end_bb];
if (else_bb.is_goto_terminated () && else_bb.successors.empty ())
add_jump (else_end_bb, final_start_bb);
}
Resolver::Resolver &resolver;
// BIR output
- std::vector<BasicBlock> basic_blocks;
+ BasicBlocks basic_blocks;
BasicBlockId current_bb = ENTRY_BASIC_BLOCK;
/**
basic_blocks.emplace_back (); // StartBB
}
- BasicBlock &get_current_bb () { return basic_blocks[current_bb.value]; }
+ BasicBlock &get_current_bb () { return basic_blocks[current_bb]; }
const LoopAndLabelCtx &lookup_label (NodeId label)
{
void add_jump (BasicBlockId from, BasicBlockId to)
{
- ctx.basic_blocks[from.value].successors.emplace_back (to);
+ ctx.basic_blocks[from].successors.emplace_back (to);
}
void add_jump_to (BasicBlockId bb) { add_jump (ctx.current_bb, bb); }
// BB0 cannot be folded as it is an entry block.
for (BasicBlockId i = {1}; i.value < func.basic_blocks.size (); ++i.value)
{
- const BasicBlock &bb = func.basic_blocks[bb_fold_map[i.value].value];
+ const BasicBlock &bb = func.basic_blocks[bb_fold_map[i.value]];
if (bb.statements.empty () && bb.is_goto_terminated ())
{
auto dst = bb.successors.at (0);
if (bb_fold_map[statement_bb.value] != statement_bb)
continue; // This BB was folded.
- if (func.basic_blocks[statement_bb.value].statements.empty ()
- && func.basic_blocks[statement_bb.value].successors.empty ())
+ if (func.basic_blocks[statement_bb].statements.empty ()
+ && func.basic_blocks[statement_bb].successors.empty ())
continue;
bb_terminated = false;
- BasicBlock &bb = func.basic_blocks[statement_bb.value];
+ BasicBlock &bb = func.basic_blocks[statement_bb];
stream << "\n";
stream << indentation << "bb" << bb_fold_map[statement_bb.value].value
<< ": {\n";
stream << "switchInt(";
visit_move_place (stmt.get_place ());
stream << ") -> [";
- print_comma_separated (stream,
- func.basic_blocks[statement_bb.value].successors,
+ print_comma_separated (stream, func.basic_blocks[statement_bb].successors,
[this] (BasicBlockId succ) {
stream << "bb" << bb_fold_map[succ.value].value;
});
case Statement::Kind::GOTO:
stream
<< "goto -> bb"
- << bb_fold_map
- [func.basic_blocks[statement_bb.value].successors.at (0).value]
- .value;
+ << bb_fold_map[func.basic_blocks[statement_bb].successors.at (0).value]
+ .value;
bb_terminated = true;
break;
case Statement::Kind::STORAGE_DEAD:
visit_move_place (place_id);
});
stream << ") -> [";
- print_comma_separated (stream,
- func.basic_blocks[statement_bb.value].successors,
+ print_comma_separated (stream, func.basic_blocks[statement_bb].successors,
[this] (BasicBlockId succ) {
stream << "bb" << bb_fold_map[succ.value].value;
});
// Read-only context.
const PlaceDB &place_db;
- const std::vector<BasicBlock> &basic_blocks;
+ const BasicBlocks &basic_blocks;
const PlaceId first_local;
const location_t location;
for (current_bb = ENTRY_BASIC_BLOCK;
current_bb.value < basic_blocks.size (); ++current_bb.value)
{
- auto &bb = basic_blocks[current_bb.value];
+ auto &bb = basic_blocks[current_bb];
for (current_stmt = 0; current_stmt < bb.statements.size ();
++current_stmt)
{
protected: // Statement visitor helpers
WARN_UNUSED_RESULT const BasicBlock &get_current_bb () const
{
- return basic_blocks[current_bb.value];
+ return basic_blocks[current_bb];
}
WARN_UNUSED_RESULT static Polonius::Point
namespace BIR {
struct BasicBlock;
+struct BasicBlockId;
+using BasicBlocks = IndexVec<BasicBlockId, BasicBlock>;
class Statement;
class AbstractExpr;
{
PlaceDB place_db;
std::vector<PlaceId> arguments;
- std::vector<BasicBlock> basic_blocks;
+ BasicBlocks basic_blocks;
FreeRegions universal_regions;
std::vector<std::pair<FreeRegion, FreeRegion>> universal_region_bounds;
std::unordered_map<Polonius::Origin, HIR::LifetimeParam *> region_hir_map;
// assert that the extracted indexes are valid
rust_assert (bb_index < bir_function.basic_blocks.size ());
rust_assert (statement_index
- < bir_function.basic_blocks[bb_index].statements.size ());
- return bir_function.basic_blocks[bb_index].statements[statement_index];
+ < bir_function.basic_blocks[{bb_index}].statements.size ());
+ return bir_function.basic_blocks[{bb_index}].statements[statement_index];
}
const BIR::Loan &