From 538c0c80d6c0814c0b98d54768daae2a19e3ef28 Mon Sep 17 00:00:00 2001 From: "Aman Khalid (from Dev Box)" Date: Thu, 10 Oct 2024 00:33:31 -0400 Subject: [PATCH 1/3] Use binary search in GetLoopByHeader --- src/coreclr/jit/flowgraph.cpp | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/coreclr/jit/flowgraph.cpp b/src/coreclr/jit/flowgraph.cpp index 5a90961bc5d01d..55dc7b023763d6 100644 --- a/src/coreclr/jit/flowgraph.cpp +++ b/src/coreclr/jit/flowgraph.cpp @@ -4487,13 +4487,30 @@ FlowGraphNaturalLoop* FlowGraphNaturalLoops::GetLoopByIndex(unsigned index) // FlowGraphNaturalLoop* FlowGraphNaturalLoops::GetLoopByHeader(BasicBlock* block) { - // TODO-TP: This can use binary search based on post order number. - for (FlowGraphNaturalLoop* loop : m_loops) + // Loops are stored in reverse post-order, + // so we can binary-search for the desired loop's header by its post-order number. + size_t min = 0; + size_t max = NumLoops(); + + while (min < max) { - if (loop->m_header == block) + const size_t mid = min + ((max - min) / 2); + FlowGraphNaturalLoop* const loop = m_loops[mid]; + BasicBlock* const header = loop->m_header; + + if (header == block) { return loop; } + else if (header->bbPostorderNum < block->bbPostorderNum) + { + max = mid; + } + else + { + assert(header->bbPostorderNum > block->bbPostorderNum); + min = mid + 1; + } } return nullptr; From ddd9b67f44c0cd864e014e91775b03a77c8ac20a Mon Sep 17 00:00:00 2001 From: Aman Khalid Date: Thu, 10 Oct 2024 10:16:30 -0400 Subject: [PATCH 2/3] Update src/coreclr/jit/flowgraph.cpp Co-authored-by: Jakob Botsch Nielsen --- src/coreclr/jit/flowgraph.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/coreclr/jit/flowgraph.cpp b/src/coreclr/jit/flowgraph.cpp index 55dc7b023763d6..a57312af616103 100644 --- a/src/coreclr/jit/flowgraph.cpp +++ b/src/coreclr/jit/flowgraph.cpp @@ -4487,6 +4487,11 @@ FlowGraphNaturalLoop* FlowGraphNaturalLoops::GetLoopByIndex(unsigned index) // FlowGraphNaturalLoop* FlowGraphNaturalLoops::GetLoopByHeader(BasicBlock* block) { + if (!m_dfsTree->Contains(block)) + { + return nullptr; + } + // Loops are stored in reverse post-order, // so we can binary-search for the desired loop's header by its post-order number. size_t min = 0; From 30ccebc83b443b750a37852271fc60ae2906dba6 Mon Sep 17 00:00:00 2001 From: "Aman Khalid (from Dev Box)" Date: Thu, 10 Oct 2024 10:29:40 -0400 Subject: [PATCH 3/3] Style --- src/coreclr/jit/flowgraph.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreclr/jit/flowgraph.cpp b/src/coreclr/jit/flowgraph.cpp index a57312af616103..3a7a22a2b01749 100644 --- a/src/coreclr/jit/flowgraph.cpp +++ b/src/coreclr/jit/flowgraph.cpp @@ -4491,7 +4491,7 @@ FlowGraphNaturalLoop* FlowGraphNaturalLoops::GetLoopByHeader(BasicBlock* block) { return nullptr; } - + // Loops are stored in reverse post-order, // so we can binary-search for the desired loop's header by its post-order number. size_t min = 0;