本文整理汇总了C++中Vunit::makeBlock方法的典型用法代码示例。如果您正苦于以下问题:C++ Vunit::makeBlock方法的具体用法?C++ Vunit::makeBlock怎么用?C++ Vunit::makeBlock使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Vunit
的用法示例。
在下文中一共展示了Vunit::makeBlock方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: splitCriticalEdges
/*
* Splits the critical edges in `unit', if any.
* Returns true iff the unit was modified.
*/
bool splitCriticalEdges(Vunit& unit) {
jit::vector<unsigned> preds(unit.blocks.size());
jit::flat_set<size_t> catch_blocks;
for (size_t b = 0; b < unit.blocks.size(); b++) {
auto succlist = succs(unit.blocks[b]);
for (auto succ : succlist) {
preds[succ]++;
}
}
auto changed = false;
for (size_t pred = 0; pred < unit.blocks.size(); pred++) {
auto succlist = succs(unit.blocks[pred]);
if (succlist.size() <= 1) continue;
for (auto& succ : succlist) {
if (preds[succ] <= 1) continue;
// split the critical edge.
auto middle = unit.makeBlock(unit.blocks[succ].area);
forwardJmp(unit, catch_blocks, middle, succ);
succ = middle;
changed = true;
}
}
// Remove any landingpad{} instructions that were hoisted to split edges.
for (auto block : catch_blocks) {
auto& code = unit.blocks[block].code;
assertx(code.front().op == Vinstr::landingpad);
code.front() = nop{};
}
return changed;
}
示例2: splitCriticalEdges
/*
* Splits the critical edges in `unit', if any.
* Returns true iff the unit was modified.
*/
bool splitCriticalEdges(Vunit& unit) {
jit::vector<unsigned> preds(unit.blocks.size());
for (size_t b = 0; b < unit.blocks.size(); b++) {
auto succlist = succs(unit.blocks[b]);
for (auto succ : succlist) {
preds[succ]++;
}
}
auto changed = false;
for (size_t pred = 0; pred < unit.blocks.size(); pred++) {
auto succlist = succs(unit.blocks[pred]);
if (succlist.size() <= 1) continue;
for (auto& succ : succlist) {
if (preds[succ] <= 1) continue;
// split the critical edge.
auto middle = unit.makeBlock(unit.blocks[succ].area);
forwardJmp(unit, middle, succ);
succ = middle;
changed = true;
}
}
return changed;
}