xref: /llvm-project/llvm/unittests/tools/llvm-exegesis/Mips/BenchmarkResultTest.cpp (revision 415bf200a725055a3a38e96269f4b752ea6fc330)
184728e65SMiloš Stojanović //===-- BenchmarkResultTest.cpp ---------------------------------*- C++ -*-===//
284728e65SMiloš Stojanović //
384728e65SMiloš Stojanović // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
484728e65SMiloš Stojanović // See https://llvm.org/LICENSE.txt for license information.
584728e65SMiloš Stojanović // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
684728e65SMiloš Stojanović //
784728e65SMiloš Stojanović //===----------------------------------------------------------------------===//
884728e65SMiloš Stojanović 
984728e65SMiloš Stojanović #include "BenchmarkResult.h"
1084728e65SMiloš Stojanović #include "MipsInstrInfo.h"
1131458a9fSMiloš Stojanović #include "TestBase.h"
1284728e65SMiloš Stojanović #include "llvm/ADT/SmallString.h"
1389b57061SReid Kleckner #include "llvm/MC/TargetRegistry.h"
1484728e65SMiloš Stojanović #include "llvm/Support/Error.h"
1584728e65SMiloš Stojanović #include "llvm/Support/Path.h"
1684728e65SMiloš Stojanović #include "llvm/Support/TargetSelect.h"
1784728e65SMiloš Stojanović #include "llvm/Support/YAMLTraits.h"
1884728e65SMiloš Stojanović #include "llvm/Support/raw_ostream.h"
19fad75598SSergej Jaskiewicz #include "llvm/Testing/Support/SupportHelpers.h"
2084728e65SMiloš Stojanović #include "gmock/gmock.h"
2184728e65SMiloš Stojanović #include "gtest/gtest.h"
2284728e65SMiloš Stojanović 
2384728e65SMiloš Stojanović using ::testing::Pointwise;
2484728e65SMiloš Stojanović 
25fad75598SSergej Jaskiewicz using llvm::unittest::TempDir;
26fad75598SSergej Jaskiewicz 
2784728e65SMiloš Stojanović namespace llvm {
2884728e65SMiloš Stojanović namespace exegesis {
2984728e65SMiloš Stojanović 
Dump(const MCInst & McInst)3084728e65SMiloš Stojanović static std::string Dump(const MCInst &McInst) {
3184728e65SMiloš Stojanović   std::string Buffer;
3284728e65SMiloš Stojanović   raw_string_ostream OS(Buffer);
3384728e65SMiloš Stojanović   McInst.print(OS);
3484728e65SMiloš Stojanović   return Buffer;
3584728e65SMiloš Stojanović }
3684728e65SMiloš Stojanović 
3784728e65SMiloš Stojanović MATCHER(EqMCInst, "") {
3884728e65SMiloš Stojanović   const std::string Lhs = Dump(get<0>(arg));
3984728e65SMiloš Stojanović   const std::string Rhs = Dump(get<1>(arg));
4084728e65SMiloš Stojanović   if (Lhs != Rhs) {
4184728e65SMiloš Stojanović     *result_listener << Lhs << " <=> " << Rhs;
4284728e65SMiloš Stojanović     return false;
4384728e65SMiloš Stojanović   }
4484728e65SMiloš Stojanović   return true;
4584728e65SMiloš Stojanović }
4684728e65SMiloš Stojanović 
4784728e65SMiloš Stojanović namespace {
4884728e65SMiloš Stojanović 
49dbefcde6STom Stellard class MipsBenchmarkResultTest : public MipsTestBase {};
5084728e65SMiloš Stojanović 
TEST_F(MipsBenchmarkResultTest,WriteToAndReadFromDisk)51dbefcde6STom Stellard TEST_F(MipsBenchmarkResultTest, WriteToAndReadFromDisk) {
5284728e65SMiloš Stojanović   ExitOnError ExitOnErr;
5384728e65SMiloš Stojanović 
54389bf5d8SAiden Grossman   Benchmark ToDisk;
5584728e65SMiloš Stojanović 
5684728e65SMiloš Stojanović   ToDisk.Key.Instructions.push_back(MCInstBuilder(Mips::XOR)
5784728e65SMiloš Stojanović                                         .addReg(Mips::T0)
5884728e65SMiloš Stojanović                                         .addReg(Mips::T1)
5984728e65SMiloš Stojanović                                         .addReg(Mips::T2));
6084728e65SMiloš Stojanović   ToDisk.Key.Config = "config";
6184728e65SMiloš Stojanović   ToDisk.Key.RegisterInitialValues = {
6284728e65SMiloš Stojanović       RegisterValue{Mips::T1, APInt(8, "123", 10)},
6384728e65SMiloš Stojanović       RegisterValue{Mips::T2, APInt(8, "456", 10)}};
64389bf5d8SAiden Grossman   ToDisk.Mode = Benchmark::Latency;
6584728e65SMiloš Stojanović   ToDisk.CpuName = "cpu_name";
6684728e65SMiloš Stojanović   ToDisk.LLVMTriple = "llvm_triple";
67*415bf200SAiden Grossman   ToDisk.MinInstructions = 1;
68c1a155bfSAiden Grossman   ToDisk.Measurements.push_back(BenchmarkMeasure::Create("a", 1, {}));
69c1a155bfSAiden Grossman   ToDisk.Measurements.push_back(BenchmarkMeasure::Create("b", 2, {}));
7084728e65SMiloš Stojanović   ToDisk.Error = "error";
7184728e65SMiloš Stojanović   ToDisk.Info = "info";
7284728e65SMiloš Stojanović 
73fad75598SSergej Jaskiewicz   TempDir TestDirectory("BenchmarkResultTestDir", /*Unique*/ true);
74fad75598SSergej Jaskiewicz   SmallString<64> Filename(TestDirectory.path());
7584728e65SMiloš Stojanović   sys::path::append(Filename, "data.yaml");
7684728e65SMiloš Stojanović   errs() << Filename << "-------\n";
77a3400191SRoman Lebedev   {
78a3400191SRoman Lebedev     int ResultFD = 0;
79a3400191SRoman Lebedev     // Create output file or open existing file and truncate it, once.
80a3400191SRoman Lebedev     ExitOnErr(errorCodeToError(openFileForWrite(Filename, ResultFD,
81a3400191SRoman Lebedev                                                 sys::fs::CD_CreateAlways,
82a3400191SRoman Lebedev                                                 sys::fs::OF_TextWithCRLF)));
83a3400191SRoman Lebedev     raw_fd_ostream FileOstr(ResultFD, true /*shouldClose*/);
8484728e65SMiloš Stojanović 
85a3400191SRoman Lebedev     ExitOnErr(ToDisk.writeYamlTo(State, FileOstr));
86a3400191SRoman Lebedev   }
87e52f8406SClement Courbet   const std::unique_ptr<MemoryBuffer> Buffer =
88e52f8406SClement Courbet       std::move(*MemoryBuffer::getFile(Filename));
89e52f8406SClement Courbet 
9084728e65SMiloš Stojanović   {
9184728e65SMiloš Stojanović     // One-element version.
9284728e65SMiloš Stojanović     const auto FromDisk =
93389bf5d8SAiden Grossman         ExitOnErr(Benchmark::readYaml(State, *Buffer));
9484728e65SMiloš Stojanović 
9584728e65SMiloš Stojanović     EXPECT_THAT(FromDisk.Key.Instructions,
9684728e65SMiloš Stojanović                 Pointwise(EqMCInst(), ToDisk.Key.Instructions));
9784728e65SMiloš Stojanović     EXPECT_EQ(FromDisk.Key.Config, ToDisk.Key.Config);
9884728e65SMiloš Stojanović     EXPECT_EQ(FromDisk.Mode, ToDisk.Mode);
9984728e65SMiloš Stojanović     EXPECT_EQ(FromDisk.CpuName, ToDisk.CpuName);
10084728e65SMiloš Stojanović     EXPECT_EQ(FromDisk.LLVMTriple, ToDisk.LLVMTriple);
101*415bf200SAiden Grossman     EXPECT_EQ(FromDisk.MinInstructions, ToDisk.MinInstructions);
10284728e65SMiloš Stojanović     EXPECT_THAT(FromDisk.Measurements, ToDisk.Measurements);
10384728e65SMiloš Stojanović     EXPECT_THAT(FromDisk.Error, ToDisk.Error);
10484728e65SMiloš Stojanović     EXPECT_EQ(FromDisk.Info, ToDisk.Info);
10584728e65SMiloš Stojanović   }
10684728e65SMiloš Stojanović   {
10784728e65SMiloš Stojanović     // Vector version.
10884728e65SMiloš Stojanović     const auto FromDiskVector =
109389bf5d8SAiden Grossman         ExitOnErr(Benchmark::readYamls(State, *Buffer));
11084728e65SMiloš Stojanović     ASSERT_EQ(FromDiskVector.size(), size_t{1});
111a5de4975SRoman Lebedev     const auto &FromDisk = FromDiskVector[0];
11284728e65SMiloš Stojanović     EXPECT_THAT(FromDisk.Key.Instructions,
11384728e65SMiloš Stojanović                 Pointwise(EqMCInst(), ToDisk.Key.Instructions));
11484728e65SMiloš Stojanović     EXPECT_EQ(FromDisk.Key.Config, ToDisk.Key.Config);
11584728e65SMiloš Stojanović     EXPECT_EQ(FromDisk.Mode, ToDisk.Mode);
11684728e65SMiloš Stojanović     EXPECT_EQ(FromDisk.CpuName, ToDisk.CpuName);
11784728e65SMiloš Stojanović     EXPECT_EQ(FromDisk.LLVMTriple, ToDisk.LLVMTriple);
118*415bf200SAiden Grossman     EXPECT_EQ(FromDisk.MinInstructions, ToDisk.MinInstructions);
11984728e65SMiloš Stojanović     EXPECT_THAT(FromDisk.Measurements, ToDisk.Measurements);
12084728e65SMiloš Stojanović     EXPECT_THAT(FromDisk.Error, ToDisk.Error);
12184728e65SMiloš Stojanović     EXPECT_EQ(FromDisk.Info, ToDisk.Info);
12284728e65SMiloš Stojanović   }
12384728e65SMiloš Stojanović }
12484728e65SMiloš Stojanović 
TEST_F(MipsBenchmarkResultTest,PerInstructionStats)125dbefcde6STom Stellard TEST_F(MipsBenchmarkResultTest, PerInstructionStats) {
12684728e65SMiloš Stojanović   PerInstructionStats Stats;
127c1a155bfSAiden Grossman   Stats.push(BenchmarkMeasure::Create("a", 0.5, {}));
128c1a155bfSAiden Grossman   Stats.push(BenchmarkMeasure::Create("a", 1.5, {}));
129c1a155bfSAiden Grossman   Stats.push(BenchmarkMeasure::Create("a", -1.0, {}));
130c1a155bfSAiden Grossman   Stats.push(BenchmarkMeasure::Create("a", 0.0, {}));
13184728e65SMiloš Stojanović   EXPECT_EQ(Stats.min(), -1.0);
13284728e65SMiloš Stojanović   EXPECT_EQ(Stats.max(), 1.5);
13384728e65SMiloš Stojanović   EXPECT_EQ(Stats.avg(), 0.25); // (0.5+1.5-1.0+0.0) / 4
13484728e65SMiloš Stojanović }
13584728e65SMiloš Stojanović } // namespace
13684728e65SMiloš Stojanović } // namespace exegesis
13784728e65SMiloš Stojanović } // namespace llvm
138