• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "Analysis.h"
2 
3 #include <cassert>
4 #include <memory>
5 
6 #include "llvm/Support/TargetRegistry.h"
7 #include "llvm/Support/TargetSelect.h"
8 #include "gmock/gmock.h"
9 #include "gtest/gtest.h"
10 
11 namespace exegesis {
12 namespace {
13 
14 using testing::Pair;
15 using testing::UnorderedElementsAre;
16 
17 class AnalysisTest : public ::testing::Test {
18 protected:
AnalysisTest()19   AnalysisTest() {
20     const std::string TT = "x86_64-unknown-linux";
21     std::string error;
22     const llvm::Target *const TheTarget =
23         llvm::TargetRegistry::lookupTarget(TT, error);
24     if (!TheTarget) {
25       llvm::errs() << error << "\n";
26       return;
27     }
28     STI.reset(TheTarget->createMCSubtargetInfo(TT, "haswell", ""));
29 
30     // Compute the ProxResIdx of ports unes in tests.
31     const auto &SM = STI->getSchedModel();
32     for (unsigned I = 0, E = SM.getNumProcResourceKinds(); I < E; ++I) {
33       const std::string Name = SM.getProcResource(I)->Name;
34       if (Name == "HWPort0") {
35         P0Idx = I;
36       } else if (Name == "HWPort1") {
37         P1Idx = I;
38       } else if (Name == "HWPort5") {
39         P5Idx = I;
40       } else if (Name == "HWPort6") {
41         P6Idx = I;
42       } else if (Name == "HWPort05") {
43         P05Idx = I;
44       } else if (Name == "HWPort0156") {
45         P0156Idx = I;
46       }
47     }
48     EXPECT_NE(P0Idx, 0);
49     EXPECT_NE(P1Idx, 0);
50     EXPECT_NE(P5Idx, 0);
51     EXPECT_NE(P6Idx, 0);
52     EXPECT_NE(P05Idx, 0);
53     EXPECT_NE(P0156Idx, 0);
54   }
55 
SetUpTestCase()56   static void SetUpTestCase() {
57     LLVMInitializeX86TargetInfo();
58     LLVMInitializeX86Target();
59     LLVMInitializeX86TargetMC();
60   }
61 
62 protected:
63   std::unique_ptr<const llvm::MCSubtargetInfo> STI;
64   uint16_t P0Idx = 0;
65   uint16_t P1Idx = 0;
66   uint16_t P5Idx = 0;
67   uint16_t P6Idx = 0;
68   uint16_t P05Idx = 0;
69   uint16_t P0156Idx = 0;
70 };
71 
TEST_F(AnalysisTest,ComputeIdealizedProcResPressure_2P0)72 TEST_F(AnalysisTest, ComputeIdealizedProcResPressure_2P0) {
73   const auto Pressure =
74       computeIdealizedProcResPressure(STI->getSchedModel(), {{P0Idx, 2}});
75   EXPECT_THAT(Pressure, UnorderedElementsAre(Pair(P0Idx, 2.0)));
76 }
77 
TEST_F(AnalysisTest,ComputeIdealizedProcResPressure_2P05)78 TEST_F(AnalysisTest, ComputeIdealizedProcResPressure_2P05) {
79   const auto Pressure =
80       computeIdealizedProcResPressure(STI->getSchedModel(), {{P05Idx, 2}});
81   EXPECT_THAT(Pressure,
82               UnorderedElementsAre(Pair(P0Idx, 1.0), Pair(P5Idx, 1.0)));
83 }
84 
TEST_F(AnalysisTest,ComputeIdealizedProcResPressure_2P05_2P0156)85 TEST_F(AnalysisTest, ComputeIdealizedProcResPressure_2P05_2P0156) {
86   const auto Pressure = computeIdealizedProcResPressure(
87       STI->getSchedModel(), {{P05Idx, 2}, {P0156Idx, 2}});
88   EXPECT_THAT(Pressure,
89               UnorderedElementsAre(Pair(P0Idx, 1.0), Pair(P1Idx, 1.0),
90                                    Pair(P5Idx, 1.0), Pair(P6Idx, 1.0)));
91 }
92 
TEST_F(AnalysisTest,ComputeIdealizedProcResPressure_1P1_1P05_2P0156)93 TEST_F(AnalysisTest, ComputeIdealizedProcResPressure_1P1_1P05_2P0156) {
94   const auto Pressure = computeIdealizedProcResPressure(
95       STI->getSchedModel(), {{P1Idx, 1}, {P05Idx, 1}, {P0156Idx, 2}});
96   EXPECT_THAT(Pressure,
97               UnorderedElementsAre(Pair(P0Idx, 1.0), Pair(P1Idx, 1.0),
98                                    Pair(P5Idx, 1.0), Pair(P6Idx, 1.0)));
99 }
100 
101 } // namespace
102 } // namespace exegesis
103