diff options
author | 2025-02-24 12:12:09 +0000 | |
---|---|---|
committer | 2025-02-27 22:58:08 -0800 | |
commit | 22cfc7f2de1f4de1616e2b2bca30e71a5b1d2748 (patch) | |
tree | 3786448ab5b170c93de485c16094aecc7f774961 /compiler/optimizing/nodes.cc | |
parent | 12f7d1eb0ff3fe0126d8dadd6bbfa8b797718e9c (diff) |
Speed up DCE, CFRE and `ReplaceUsesDominatedBy()`...
... by using `BitViewVector<>`.
Test: m test-art-host-gtest
Test: testrunner.py --host --optimizing
Bug: 331194861
Change-Id: If22934aeae82b21ebf9fc20e817d0958bd6edec8
Diffstat (limited to 'compiler/optimizing/nodes.cc')
-rw-r--r-- | compiler/optimizing/nodes.cc | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/compiler/optimizing/nodes.cc b/compiler/optimizing/nodes.cc index 752e8b10d1..6b74e7246e 100644 --- a/compiler/optimizing/nodes.cc +++ b/compiler/optimizing/nodes.cc @@ -1457,18 +1457,17 @@ void HInstruction::ReplaceUsesDominatedBy(HInstruction* dominator, HInstruction* replacement, bool strictly_dominated) { HBasicBlock* dominator_block = dominator->GetBlock(); - std::optional<ArenaBitVector> visited_blocks; + BitVectorView<size_t> visited_blocks; // Lazily compute the dominated blocks to faster calculation of domination afterwards. auto maybe_generate_visited_blocks = [&visited_blocks, this, dominator_block]() { - if (visited_blocks.has_value()) { + if (visited_blocks.SizeInBits() != 0u) { + DCHECK_EQ(visited_blocks.SizeInBits(), GetBlock()->GetGraph()->GetBlocks().size()); return; } HGraph* graph = GetBlock()->GetGraph(); - visited_blocks.emplace(graph->GetAllocator(), - graph->GetBlocks().size(), - /* expandable= */ false, - kArenaAllocMisc); + visited_blocks = ArenaBitVector::CreateFixedSize( + graph->GetAllocator(), graph->GetBlocks().size(), kArenaAllocMisc); ScopedArenaAllocator allocator(graph->GetArenaStack()); ScopedArenaQueue<const HBasicBlock*> worklist(allocator.Adapter(kArenaAllocMisc)); worklist.push(dominator_block); @@ -1476,9 +1475,9 @@ void HInstruction::ReplaceUsesDominatedBy(HInstruction* dominator, while (!worklist.empty()) { const HBasicBlock* current = worklist.front(); worklist.pop(); - visited_blocks->SetBit(current->GetBlockId()); + visited_blocks.SetBit(current->GetBlockId()); for (HBasicBlock* dominated : current->GetDominatedBlocks()) { - if (visited_blocks->IsBitSet(dominated->GetBlockId())) { + if (visited_blocks.IsBitSet(dominated->GetBlockId())) { continue; } worklist.push(dominated); @@ -1501,7 +1500,7 @@ void HInstruction::ReplaceUsesDominatedBy(HInstruction* dominator, } else { // Block domination. maybe_generate_visited_blocks(); - dominated = visited_blocks->IsBitSet(block->GetBlockId()); + dominated = visited_blocks.IsBitSet(block->GetBlockId()); } if (dominated) { @@ -1512,7 +1511,7 @@ void HInstruction::ReplaceUsesDominatedBy(HInstruction* dominator, // for their inputs. HBasicBlock* predecessor = block->GetPredecessors()[index]; maybe_generate_visited_blocks(); - if (visited_blocks->IsBitSet(predecessor->GetBlockId())) { + if (visited_blocks.IsBitSet(predecessor->GetBlockId())) { user->ReplaceInput(replacement, index); } } |