Skip to content

Commit

Permalink
[llvm-exegesis] Make duplicate snippet repetitor produce whole snippe…
Browse files Browse the repository at this point in the history
…ts (#77224)

Currently, the duplicate snippet repetitor will truncate snippets that
do not exactly divide the minimum number of instructions. This patch
corrects that behavior by making the duplicate snippet repetitor
duplicate the snippet in its entirety until the minimum number of
instructions has been reached.

This makes the behavior consistent with the loop snippet repetitor,
which will execute at least `--num-repetitions` (soon to be renamed
`--min-instructions`) instructions.
  • Loading branch information
boomanaiden154 authored Jan 19, 2024
1 parent c067524 commit 2b31a67
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 6 deletions.
8 changes: 4 additions & 4 deletions llvm/tools/llvm-exegesis/lib/SnippetRepetitor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,10 @@ class DuplicateSnippetRepetitor : public SnippetRepetitor {
CleanupMemory](FunctionFiller &Filler) {
auto Entry = Filler.getEntry();
if (!Instructions.empty()) {
// Add the whole snippet at least once.
Entry.addInstructions(Instructions);
for (unsigned I = Instructions.size(); I < MinInstructions; ++I) {
Entry.addInstruction(Instructions[I % Instructions.size()]);
const unsigned NumRepetitions =
divideCeil(MinInstructions, Instructions.size());
for (unsigned I = 0; I < NumRepetitions; ++I) {
Entry.addInstructions(Instructions);
}
}
Entry.addReturn(State.getExegesisTarget(), CleanupMemory);
Expand Down
18 changes: 16 additions & 2 deletions llvm/unittests/tools/llvm-exegesis/X86/SnippetRepetitorTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,11 @@ class X86SnippetRepetitorTest : public X86TestBase {
MF = &createVoidVoidPtrMachineFunction("TestFn", Mod.get(), MMI.get());
}

void TestCommon(Benchmark::RepetitionModeE RepetitionMode) {
void TestCommon(Benchmark::RepetitionModeE RepetitionMode,
unsigned SnippetInstructions = 1) {
const auto Repetitor = SnippetRepetitor::Create(RepetitionMode, State);
const std::vector<MCInst> Instructions = {MCInstBuilder(X86::NOOP)};
const std::vector<MCInst> Instructions(SnippetInstructions,
MCInstBuilder(X86::NOOP));
FunctionFiller Sink(*MF, {X86::EAX});
const auto Fill =
Repetitor->Repeat(Instructions, kMinInstructions, kLoopBodySize, false);
Expand Down Expand Up @@ -74,6 +76,18 @@ TEST_F(X86SnippetRepetitorTest, Duplicate) {
HasOpcode(X86::NOOP), HasOpcode(X86::RET64)));
}

TEST_F(X86SnippetRepetitorTest, DuplicateSnippetInstructionCount) {
TestCommon(Benchmark::Duplicate, 2);
// Duplicating a snippet of two instructions with the minimum number of
// instructions set to three duplicates the snippet twice for a total of
// four instructions.
ASSERT_EQ(MF->getNumBlockIDs(), 1u);
EXPECT_THAT(MF->getBlockNumbered(0)->instrs(),
ElementsAre(HasOpcode(X86::NOOP), HasOpcode(X86::NOOP),
HasOpcode(X86::NOOP), HasOpcode(X86::NOOP),
HasOpcode(X86::RET64)));
}

TEST_F(X86SnippetRepetitorTest, Loop) {
TestCommon(Benchmark::Loop);
// Duplicating creates an entry block, a loop body and a ret block.
Expand Down

0 comments on commit 2b31a67

Please sign in to comment.