mirror of
https://github.com/RGBCube/serenity
synced 2025-05-16 19:55:06 +00:00
LibJS: Fix MergeBlocks emitting some blocks twice
This commit is contained in:
parent
28e2467b48
commit
c66284ab0b
1 changed files with 15 additions and 8 deletions
|
@ -109,14 +109,21 @@ void MergeBlocks::perform(PassPipelineExecutable& executable)
|
|||
}
|
||||
|
||||
auto blocks_to_merge_copy = blocks_to_merge;
|
||||
for (auto& last : blocks_to_merge) {
|
||||
auto entry = cfg.find(last);
|
||||
if (entry == cfg.end())
|
||||
continue;
|
||||
auto successor = *entry->value.begin();
|
||||
if (auto it = successors.find(successor); !it.is_end()) {
|
||||
successors.insert(it.index(), last);
|
||||
blocks_to_merge_copy.remove(last);
|
||||
// We need to do the following multiple times, due to it not being
|
||||
// guaranteed, that the blocks are in sequential order
|
||||
bool did_prepend = true;
|
||||
while (did_prepend) {
|
||||
did_prepend = false;
|
||||
for (auto const* last : blocks_to_merge) {
|
||||
auto entry = cfg.find(last);
|
||||
if (entry == cfg.end())
|
||||
continue;
|
||||
auto const* successor = *entry->value.begin();
|
||||
if (successor == successors.first()) {
|
||||
successors.prepend(last);
|
||||
blocks_to_merge_copy.remove(last);
|
||||
did_prepend = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue