Reformat to better match existing style.
This commit is contained in:
parent
cce6a8acaf
commit
159b59faa7
@ -64,40 +64,41 @@ namespace {
|
|||||||
// Traverses CFG in a readable order, invoking a pre-set callback on each block.
|
// Traverses CFG in a readable order, invoking a pre-set callback on each block.
|
||||||
// Use by calling visit() on the root block.
|
// Use by calling visit() on the root block.
|
||||||
class ReadableOrderTraverser {
|
class ReadableOrderTraverser {
|
||||||
public:
|
public:
|
||||||
explicit ReadableOrderTraverser(std::function<void(Block*)> callback)
|
explicit ReadableOrderTraverser(std::function<void(Block*)> callback) : callback_(callback) {}
|
||||||
: callback_(callback) {}
|
|
||||||
|
|
||||||
// Visits the block if it hasn't been visited already and isn't currently
|
// Visits the block if it hasn't been visited already and isn't currently
|
||||||
// being delayed. Invokes callback(block), then descends into its successors.
|
// being delayed. Invokes callback(block), then descends into its successors.
|
||||||
// Delays merge-block processing until all the branches have been completed.
|
// Delays merge-block processing until all the branches have been completed.
|
||||||
void visit(Block* block) {
|
void visit(Block* block)
|
||||||
|
{
|
||||||
assert(block);
|
assert(block);
|
||||||
if (visited_[block] || delayed_[block]) return;
|
if (visited_[block] || delayed_[block])
|
||||||
|
return;
|
||||||
callback_(block);
|
callback_(block);
|
||||||
visited_[block] = true;
|
visited_[block] = true;
|
||||||
Block* mergeBlock = nullptr;
|
Block* mergeBlock = nullptr;
|
||||||
auto mergeInst = block->getMergeInstruction();
|
auto mergeInst = block->getMergeInstruction();
|
||||||
if (mergeInst) {
|
if (mergeInst) {
|
||||||
Id mergeId = mergeInst->getIdOperand(0);
|
Id mergeId = mergeInst->getIdOperand(0);
|
||||||
mergeBlock =
|
mergeBlock = block->getParent().getParent().getInstruction(mergeId)->getBlock();
|
||||||
block->getParent().getParent().getInstruction(mergeId)->getBlock();
|
|
||||||
delayed_[mergeBlock] = true;
|
delayed_[mergeBlock] = true;
|
||||||
}
|
}
|
||||||
for (const auto succ : block->getSuccessors()) visit(succ);
|
for (const auto succ : block->getSuccessors())
|
||||||
|
visit(succ);
|
||||||
if (mergeBlock) {
|
if (mergeBlock) {
|
||||||
delayed_[mergeBlock] = false;
|
delayed_[mergeBlock] = false;
|
||||||
visit(mergeBlock);
|
visit(mergeBlock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::function<void(Block*)> callback_;
|
std::function<void(Block*)> callback_;
|
||||||
// Whether a block has already been visited or is being delayed.
|
// Whether a block has already been visited or is being delayed.
|
||||||
std::unordered_map<Block*, bool> visited_, delayed_;
|
std::unordered_map<Block *, bool> visited_, delayed_;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
void spv::inReadableOrder(Block* root, std::function<void(Block*)> callback) {
|
void spv::inReadableOrder(Block* root, std::function<void(Block*)> callback)
|
||||||
|
{
|
||||||
ReadableOrderTraverser(callback).visit(root);
|
ReadableOrderTraverser(callback).visit(root);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user