From 046ddd4db1589e830339a7fb5b42c507f3d6015c Mon Sep 17 00:00:00 2001 From: Xuan Zhang Date: Fri, 26 Apr 2024 12:44:02 -0700 Subject: [PATCH 1/5] efficient implementation of MachineOutliner::findCandidates() --- llvm/lib/CodeGen/MachineOutliner.cpp | 22 ++++++++++--------- .../AArch64/machine-outliner-overlap.mir | 12 +++++----- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/llvm/lib/CodeGen/MachineOutliner.cpp b/llvm/lib/CodeGen/MachineOutliner.cpp index dc2f5ef15206e..d553c0e6d2477 100644 --- a/llvm/lib/CodeGen/MachineOutliner.cpp +++ b/llvm/lib/CodeGen/MachineOutliner.cpp @@ -593,7 +593,11 @@ void MachineOutliner::findCandidates( unsigned NumDiscarded = 0; unsigned NumKept = 0; #endif - for (const unsigned &StartIdx : RS.StartIndices) { + // Sort the start indices so that we can efficiently check if candidates + // overlap with each other in MachineOutliner::findCandidates(). + SmallVector SortedStartIndices(RS.StartIndices); + llvm::sort(SortedStartIndices); + for (const unsigned &StartIdx : SortedStartIndices) { // Trick: Discard some candidates that would be incompatible with the // ones we've already found for this sequence. This will save us some // work in candidate selection. @@ -616,17 +620,15 @@ void MachineOutliner::findCandidates( // * End before the other starts // * Start after the other ends unsigned EndIdx = StartIdx + StringLen - 1; - auto FirstOverlap = find_if( - CandidatesForRepeatedSeq, [StartIdx, EndIdx](const Candidate &C) { - return EndIdx >= C.getStartIdx() && StartIdx <= C.getEndIdx(); - }); - if (FirstOverlap != CandidatesForRepeatedSeq.end()) { + if (CandidatesForRepeatedSeq.size() > 0 && + StartIdx <= CandidatesForRepeatedSeq.back().getEndIdx()) { #ifndef NDEBUG ++NumDiscarded; - LLVM_DEBUG(dbgs() << " .. DISCARD candidate @ [" << StartIdx - << ", " << EndIdx << "]; overlaps with candidate @ [" - << FirstOverlap->getStartIdx() << ", " - << FirstOverlap->getEndIdx() << "]\n"); + LLVM_DEBUG(dbgs() << " .. DISCARD candidate @ [" << StartIdx << ", " + << EndIdx << "]; overlaps with candidate @ [" + << CandidatesForRepeatedSeq.back().getStartIdx() + << ", " << CandidatesForRepeatedSeq.back().getEndIdx() + << "]\n"); #endif continue; } diff --git a/llvm/test/CodeGen/AArch64/machine-outliner-overlap.mir b/llvm/test/CodeGen/AArch64/machine-outliner-overlap.mir index 649bb33828c32..c6bd4c1d04d87 100644 --- a/llvm/test/CodeGen/AArch64/machine-outliner-overlap.mir +++ b/llvm/test/CodeGen/AArch64/machine-outliner-overlap.mir @@ -8,27 +8,27 @@ # CHECK-NEXT: Candidates discarded: 0 # CHECK-NEXT: Candidates kept: 2 # CHECK-DAG: Sequence length: 8 -# CHECK-NEXT: .. DISCARD candidate @ [5, 12]; overlaps with candidate @ [12, 19] +# CHECK-NEXT: .. DISCARD candidate @ [12, 19]; overlaps with candidate @ [5, 12] # CHECK-NEXT: Candidates discarded: 1 # CHECK-NEXT: Candidates kept: 1 # CHECK-DAG: Sequence length: 9 -# CHECK-NEXT: .. DISCARD candidate @ [4, 12]; overlaps with candidate @ [11, 19] +# CHECK-NEXT: .. DISCARD candidate @ [11, 19]; overlaps with candidate @ [4, 12] # CHECK-NEXT: Candidates discarded: 1 # CHECK-NEXT: Candidates kept: 1 # CHECK-DAG: Sequence length: 10 -# CHECK-NEXT: .. DISCARD candidate @ [3, 12]; overlaps with candidate @ [10, 19] +# CHECK-NEXT: .. DISCARD candidate @ [10, 19]; overlaps with candidate @ [3, 12] # CHECK-NEXT: Candidates discarded: 1 # CHECK-NEXT: Candidates kept: 1 # CHECK-DAG: Sequence length: 11 -# CHECK-NEXT: .. DISCARD candidate @ [2, 12]; overlaps with candidate @ [9, 19] +# CHECK-NEXT: .. DISCARD candidate @ [9, 19]; overlaps with candidate @ [2, 12] # CHECK-NEXT: Candidates discarded: 1 # CHECK-NEXT: Candidates kept: 1 # CHECK-DAG: Sequence length: 12 -# CHECK-NEXT: .. DISCARD candidate @ [1, 12]; overlaps with candidate @ [8, 19] +# CHECK-NEXT: .. DISCARD candidate @ [8, 19]; overlaps with candidate @ [1, 12] # CHECK-NEXT: Candidates discarded: 1 # CHECK-NEXT: Candidates kept: 1 # CHECK-DAG: Sequence length: 13 -# CHECK-NEXT: .. DISCARD candidate @ [0, 12]; overlaps with candidate @ [7, 19] +# CHECK-NEXT: .. DISCARD candidate @ [7, 19]; overlaps with candidate @ [0, 12] # CHECK-NEXT: Candidates discarded: 1 # CHECK-NEXT: Candidates kept: 1 From de64e6fa3a4e8410e1f16763b15777bc22953291 Mon Sep 17 00:00:00 2001 From: Xuan Zhang Date: Fri, 3 May 2024 08:32:20 -0700 Subject: [PATCH 2/5] update check on empty vector --- llvm/lib/CodeGen/MachineOutliner.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/lib/CodeGen/MachineOutliner.cpp b/llvm/lib/CodeGen/MachineOutliner.cpp index d553c0e6d2477..4b75f1cd4ae43 100644 --- a/llvm/lib/CodeGen/MachineOutliner.cpp +++ b/llvm/lib/CodeGen/MachineOutliner.cpp @@ -620,7 +620,7 @@ void MachineOutliner::findCandidates( // * End before the other starts // * Start after the other ends unsigned EndIdx = StartIdx + StringLen - 1; - if (CandidatesForRepeatedSeq.size() > 0 && + if (!CandidatesForRepeatedSeq.empty() && StartIdx <= CandidatesForRepeatedSeq.back().getEndIdx()) { #ifndef NDEBUG ++NumDiscarded; From 358c9541645156646b0de844982a4ccb193ecfd9 Mon Sep 17 00:00:00 2001 From: Xuan Zhang Date: Mon, 6 May 2024 07:51:51 -0700 Subject: [PATCH 3/5] retrigger checks From 632f4820ee172cba6acb7b8cb85a116ffd729fb1 Mon Sep 17 00:00:00 2001 From: Xuan Zhang Date: Tue, 28 May 2024 13:22:02 -0700 Subject: [PATCH 4/5] remove const and sort in place --- llvm/lib/CodeGen/MachineOutliner.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/llvm/lib/CodeGen/MachineOutliner.cpp b/llvm/lib/CodeGen/MachineOutliner.cpp index 4b75f1cd4ae43..9d192f67e6579 100644 --- a/llvm/lib/CodeGen/MachineOutliner.cpp +++ b/llvm/lib/CodeGen/MachineOutliner.cpp @@ -584,7 +584,7 @@ void MachineOutliner::findCandidates( LLVM_DEBUG(dbgs() << "*** Discarding overlapping candidates *** \n"); LLVM_DEBUG( dbgs() << "Searching for overlaps in all repeated sequences...\n"); - for (const SuffixTree::RepeatedSubstring &RS : ST) { + for (SuffixTree::RepeatedSubstring &RS : ST) { CandidatesForRepeatedSeq.clear(); unsigned StringLen = RS.Length; LLVM_DEBUG(dbgs() << " Sequence length: " << StringLen << "\n"); @@ -595,9 +595,8 @@ void MachineOutliner::findCandidates( #endif // Sort the start indices so that we can efficiently check if candidates // overlap with each other in MachineOutliner::findCandidates(). - SmallVector SortedStartIndices(RS.StartIndices); - llvm::sort(SortedStartIndices); - for (const unsigned &StartIdx : SortedStartIndices) { + llvm::sort(RS.StartIndices); + for (const unsigned &StartIdx : RS.StartIndices) { // Trick: Discard some candidates that would be incompatible with the // ones we've already found for this sequence. This will save us some // work in candidate selection. From 95ddb95cfdd1ea0624a87c239947f4f7820ed9b1 Mon Sep 17 00:00:00 2001 From: Xuan Zhang Date: Mon, 3 Jun 2024 06:11:51 -0700 Subject: [PATCH 5/5] modify comments --- llvm/lib/CodeGen/MachineOutliner.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/lib/CodeGen/MachineOutliner.cpp b/llvm/lib/CodeGen/MachineOutliner.cpp index 9d192f67e6579..c67ccb61cdaed 100644 --- a/llvm/lib/CodeGen/MachineOutliner.cpp +++ b/llvm/lib/CodeGen/MachineOutliner.cpp @@ -594,7 +594,7 @@ void MachineOutliner::findCandidates( unsigned NumKept = 0; #endif // Sort the start indices so that we can efficiently check if candidates - // overlap with each other in MachineOutliner::findCandidates(). + // overlap with the ones we've already found for this sequence. llvm::sort(RS.StartIndices); for (const unsigned &StartIdx : RS.StartIndices) { // Trick: Discard some candidates that would be incompatible with the