[llvm] r346411 - [PowerPC][llvm-exegesis] Add a PowerPC target

Jinsong Ji via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 8 08:51:42 PST 2018


Author: jsji
Date: Thu Nov  8 08:51:42 2018
New Revision: 346411

URL: http://llvm.org/viewvc/llvm-project?rev=346411&view=rev
Log:
[PowerPC][llvm-exegesis] Add a PowerPC target

This is patch to add PowerPC target to llvm-exegesis.
The target does just enough to be able to run llvm-exegesis in latency mode for at least some opcodes.

Differential Revision: https://reviews.llvm.org/D54185


Added:
    llvm/trunk/tools/llvm-exegesis/lib/PowerPC/
    llvm/trunk/tools/llvm-exegesis/lib/PowerPC/CMakeLists.txt
    llvm/trunk/tools/llvm-exegesis/lib/PowerPC/LLVMBuild.txt
    llvm/trunk/tools/llvm-exegesis/lib/PowerPC/Target.cpp
    llvm/trunk/unittests/tools/llvm-exegesis/PowerPC/
    llvm/trunk/unittests/tools/llvm-exegesis/PowerPC/AnalysisTest.cpp
    llvm/trunk/unittests/tools/llvm-exegesis/PowerPC/CMakeLists.txt
    llvm/trunk/unittests/tools/llvm-exegesis/PowerPC/TargetTest.cpp
Modified:
    llvm/trunk/tools/llvm-exegesis/lib/CMakeLists.txt
    llvm/trunk/unittests/tools/llvm-exegesis/CMakeLists.txt

Modified: llvm/trunk/tools/llvm-exegesis/lib/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-exegesis/lib/CMakeLists.txt?rev=346411&r1=346410&r2=346411&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-exegesis/lib/CMakeLists.txt (original)
+++ llvm/trunk/tools/llvm-exegesis/lib/CMakeLists.txt Thu Nov  8 08:51:42 2018
@@ -8,6 +8,10 @@ if (LLVM_TARGETS_TO_BUILD MATCHES "AArch
   add_subdirectory(AArch64)
   set(TARGETS_TO_APPEND "${TARGETS_TO_APPEND} AArch64")
 endif()
+if (LLVM_TARGETS_TO_BUILD MATCHES "PowerPC")
+  add_subdirectory(PowerPC)
+  set(TARGETS_TO_APPEND "${TARGETS_TO_APPEND} PowerPC")
+endif()
 
 set(LLVM_EXEGESIS_TARGETS "${LLVM_EXEGESIS_TARGETS} ${TARGETS_TO_APPEND}" PARENT_SCOPE)
 

Added: llvm/trunk/tools/llvm-exegesis/lib/PowerPC/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-exegesis/lib/PowerPC/CMakeLists.txt?rev=346411&view=auto
==============================================================================
--- llvm/trunk/tools/llvm-exegesis/lib/PowerPC/CMakeLists.txt (added)
+++ llvm/trunk/tools/llvm-exegesis/lib/PowerPC/CMakeLists.txt Thu Nov  8 08:51:42 2018
@@ -0,0 +1,18 @@
+include_directories(
+  ${LLVM_MAIN_SRC_DIR}/lib/Target/PowerPC
+  ${LLVM_BINARY_DIR}/lib/Target/PowerPC
+  )
+
+add_library(LLVMExegesisPowerPC
+  STATIC
+  Target.cpp
+  )
+
+llvm_update_compile_flags(LLVMExegesisPowerPC)
+llvm_map_components_to_libnames(libs
+  PowerPC
+  Exegesis
+  )
+
+target_link_libraries(LLVMExegesisPowerPC ${libs})
+set_target_properties(LLVMExegesisPowerPC PROPERTIES FOLDER "Libraries")

Added: llvm/trunk/tools/llvm-exegesis/lib/PowerPC/LLVMBuild.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-exegesis/lib/PowerPC/LLVMBuild.txt?rev=346411&view=auto
==============================================================================
--- llvm/trunk/tools/llvm-exegesis/lib/PowerPC/LLVMBuild.txt (added)
+++ llvm/trunk/tools/llvm-exegesis/lib/PowerPC/LLVMBuild.txt Thu Nov  8 08:51:42 2018
@@ -0,0 +1,22 @@
+;===- ./tools/llvm-exegesis/lib/PowerPC/LLVMBuild.txt ---------------*- Conf -*--===;
+;
+;                     The LLVM Compiler Infrastructure
+;
+; This file is distributed under the University of Illinois Open Source
+; License. See LICENSE.TXT for details.
+;
+;===------------------------------------------------------------------------===;
+;
+; This is an LLVMBuild description file for the components in this subdirectory.
+;
+; For more information on the LLVMBuild system, please see:
+;
+;   http://llvm.org/docs/LLVMBuild.html
+;
+;===------------------------------------------------------------------------===;
+
+[component_0]
+type = Library
+name = ExegesisPowerPC
+parent = Libraries
+required_libraries = PowerPC

Added: llvm/trunk/tools/llvm-exegesis/lib/PowerPC/Target.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-exegesis/lib/PowerPC/Target.cpp?rev=346411&view=auto
==============================================================================
--- llvm/trunk/tools/llvm-exegesis/lib/PowerPC/Target.cpp (added)
+++ llvm/trunk/tools/llvm-exegesis/lib/PowerPC/Target.cpp Thu Nov  8 08:51:42 2018
@@ -0,0 +1,92 @@
+//===-- Target.cpp ----------------------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+// The PowerPC ExegesisTarget.
+//===----------------------------------------------------------------------===//
+#include "../Target.h"
+#include "../Latency.h"
+#include "PPC.h"
+#include "PPCRegisterInfo.h"
+
+namespace llvm {
+namespace exegesis {
+
+namespace {
+class PowerPCLatencyBenchmarkRunner : public LatencyBenchmarkRunner {
+public:
+  PowerPCLatencyBenchmarkRunner(const LLVMState &State)
+      : LatencyBenchmarkRunner(State) {}
+
+private:
+  const char *getCounterName() const override {
+    // All PowerPC subtargets have CYCLES as the cycle counter name
+    return "CYCLES";
+  }
+};
+} // end anonymous namespace
+
+namespace {
+class ExegesisPowerPCTarget : public ExegesisTarget {
+public:
+  ExegesisPowerPCTarget() : ExegesisTarget({}) {}
+
+private:
+  std::vector<llvm::MCInst> setRegTo(const llvm::MCSubtargetInfo &STI,
+                                     unsigned Reg,
+                                     const llvm::APInt &Value) const override;
+  bool matchesArch(llvm::Triple::ArchType Arch) const override {
+    return Arch == llvm::Triple::ppc64le;
+  }
+  std::unique_ptr<BenchmarkRunner>
+  createLatencyBenchmarkRunner(const LLVMState &State) const override {
+    return llvm::make_unique<PowerPCLatencyBenchmarkRunner>(State);
+  }
+};
+} // end anonymous namespace
+
+static unsigned getLoadImmediateOpcode(unsigned RegBitWidth) {
+  switch (RegBitWidth) {
+  case 32:
+    return llvm::PPC::LI;
+  case 64:
+    return llvm::PPC::LI8;
+  }
+  llvm_unreachable("Invalid Value Width");
+}
+
+// Generates instruction to load an immediate value into a register.
+static llvm::MCInst loadImmediate(unsigned Reg, unsigned RegBitWidth,
+                                  const llvm::APInt &Value) {
+  if (Value.getBitWidth() > RegBitWidth)
+    llvm_unreachable("Value must fit in the Register");
+  return llvm::MCInstBuilder(getLoadImmediateOpcode(RegBitWidth))
+      .addReg(Reg)
+      .addImm(Value.getZExtValue());
+}
+
+std::vector<llvm::MCInst>
+ExegesisPowerPCTarget::setRegTo(const llvm::MCSubtargetInfo &STI, unsigned Reg,
+                                const llvm::APInt &Value) const {
+  if (llvm::PPC::GPRCRegClass.contains(Reg))
+    return {loadImmediate(Reg, 32, Value)};
+  if (llvm::PPC::G8RCRegClass.contains(Reg))
+    return {loadImmediate(Reg, 64, Value)};
+  llvm::errs() << "setRegTo is not implemented, results will be unreliable\n";
+  return {};
+}
+
+static ExegesisTarget *getTheExegesisPowerPCTarget() {
+  static ExegesisPowerPCTarget Target;
+  return &Target;
+}
+
+void InitializePowerPCExegesisTarget() {
+  ExegesisTarget::registerTarget(getTheExegesisPowerPCTarget());
+}
+
+} // namespace exegesis
+} // namespace llvm

Modified: llvm/trunk/unittests/tools/llvm-exegesis/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/tools/llvm-exegesis/CMakeLists.txt?rev=346411&r1=346410&r2=346411&view=diff
==============================================================================
--- llvm/trunk/unittests/tools/llvm-exegesis/CMakeLists.txt (original)
+++ llvm/trunk/unittests/tools/llvm-exegesis/CMakeLists.txt Thu Nov  8 08:51:42 2018
@@ -27,3 +27,6 @@ endif()
 if(LLVM_TARGETS_TO_BUILD MATCHES "AArch64")
   add_subdirectory(AArch64)
 endif()
+if(LLVM_TARGETS_TO_BUILD MATCHES "PowerPC")
+  add_subdirectory(PowerPC)
+endif()

Added: llvm/trunk/unittests/tools/llvm-exegesis/PowerPC/AnalysisTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/tools/llvm-exegesis/PowerPC/AnalysisTest.cpp?rev=346411&view=auto
==============================================================================
--- llvm/trunk/unittests/tools/llvm-exegesis/PowerPC/AnalysisTest.cpp (added)
+++ llvm/trunk/unittests/tools/llvm-exegesis/PowerPC/AnalysisTest.cpp Thu Nov  8 08:51:42 2018
@@ -0,0 +1,93 @@
+//===-- AnalysisTest.cpp ---------------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "Analysis.h"
+
+#include <cassert>
+#include <memory>
+
+#include "llvm/Support/TargetRegistry.h"
+#include "llvm/Support/TargetSelect.h"
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+namespace llvm{
+namespace exegesis {
+namespace {
+
+using testing::Pair;
+using testing::UnorderedElementsAre;
+
+class AnalysisTest : public ::testing::Test {
+protected:
+  AnalysisTest() {
+    const std::string TT = "powerpc64le-unknown-linux";
+    std::string error;
+    const llvm::Target *const TheTarget =
+        llvm::TargetRegistry::lookupTarget(TT, error);
+    if (!TheTarget) {
+      llvm::errs() << error << "\n";
+      return;
+    }
+    STI.reset(TheTarget->createMCSubtargetInfo(TT, "pwr9", ""));
+
+    // Compute the ProxResIdx of ports uses in tests.
+    const auto &SM = STI->getSchedModel();
+    for (unsigned I = 0, E = SM.getNumProcResourceKinds(); I < E; ++I) {
+      const std::string Name = SM.getProcResource(I)->Name;
+      if (Name == "ALU") {
+        ALUIdx = I;
+      } else if (Name == "ALUE") {
+        ALUEIdx = I;
+      } else if (Name == "ALUO") {
+        ALUOIdx = I;
+      } else if (Name == "IP_AGEN") {
+        IPAGENIdx = I;
+      }
+    }
+    EXPECT_NE(ALUIdx, 0);
+    EXPECT_NE(ALUEIdx, 0);
+    EXPECT_NE(ALUOIdx, 0);
+    EXPECT_NE(IPAGENIdx, 0);
+  }
+
+  static void SetUpTestCase() {
+    LLVMInitializePowerPCTargetInfo();
+    LLVMInitializePowerPCTarget();
+    LLVMInitializePowerPCTargetMC();
+  }
+
+protected:
+  std::unique_ptr<const llvm::MCSubtargetInfo> STI;
+  uint16_t ALUIdx = 0;
+  uint16_t ALUEIdx = 0;
+  uint16_t ALUOIdx = 0;
+  uint16_t IPAGENIdx = 0;
+};
+
+TEST_F(AnalysisTest, ComputeIdealizedProcResPressure_2ALU) {
+  const auto Pressure =
+      computeIdealizedProcResPressure(STI->getSchedModel(), {{ALUIdx, 2}});
+  EXPECT_THAT(Pressure, UnorderedElementsAre(Pair(ALUIdx, 2.0)));
+}
+
+TEST_F(AnalysisTest, ComputeIdealizedProcResPressure_1ALUE) {
+  const auto Pressure =
+      computeIdealizedProcResPressure(STI->getSchedModel(), {{ALUEIdx, 2}});
+  EXPECT_THAT(Pressure, UnorderedElementsAre(Pair(ALUEIdx, 2.0)));
+}
+
+TEST_F(AnalysisTest, ComputeIdealizedProcResPressure_1ALU1IPAGEN) {
+  const auto Pressure =
+      computeIdealizedProcResPressure(STI->getSchedModel(), {{ALUIdx, 1}, {IPAGENIdx, 1}});
+  EXPECT_THAT(Pressure, UnorderedElementsAre(Pair(ALUIdx, 1.0),Pair(IPAGENIdx, 1)));
+}
+} // namespace
+} // namespace exegesis
+} // namespace llvm

Added: llvm/trunk/unittests/tools/llvm-exegesis/PowerPC/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/tools/llvm-exegesis/PowerPC/CMakeLists.txt?rev=346411&view=auto
==============================================================================
--- llvm/trunk/unittests/tools/llvm-exegesis/PowerPC/CMakeLists.txt (added)
+++ llvm/trunk/unittests/tools/llvm-exegesis/PowerPC/CMakeLists.txt Thu Nov  8 08:51:42 2018
@@ -0,0 +1,22 @@
+include_directories(
+  ${LLVM_MAIN_SRC_DIR}/lib/Target/PowerPC
+  ${LLVM_BINARY_DIR}/lib/Target/PowerPC
+  ${LLVM_MAIN_SRC_DIR}/tools/llvm-exegesis/lib
+  )
+
+set(LLVM_LINK_COMPONENTS
+  MC
+  MCParser
+  Object
+  Support
+  Symbolize
+  PowerPC
+  )
+
+add_llvm_unittest(LLVMExegesisPowerPCTests
+  AnalysisTest.cpp
+  TargetTest.cpp
+  )
+target_link_libraries(LLVMExegesisPowerPCTests PRIVATE
+  LLVMExegesis
+  LLVMExegesisPowerPC)

Added: llvm/trunk/unittests/tools/llvm-exegesis/PowerPC/TargetTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/tools/llvm-exegesis/PowerPC/TargetTest.cpp?rev=346411&view=auto
==============================================================================
--- llvm/trunk/unittests/tools/llvm-exegesis/PowerPC/TargetTest.cpp (added)
+++ llvm/trunk/unittests/tools/llvm-exegesis/PowerPC/TargetTest.cpp Thu Nov  8 08:51:42 2018
@@ -0,0 +1,64 @@
+//===-- TargetTest.cpp ---------------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "Target.h"
+
+#include <cassert>
+#include <memory>
+
+#include "MCTargetDesc/PPCMCTargetDesc.h"
+#include "llvm/Support/TargetRegistry.h"
+#include "llvm/Support/TargetSelect.h"
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+namespace llvm{
+namespace exegesis {
+
+void InitializePowerPCExegesisTarget();
+
+namespace {
+
+using testing::NotNull;
+using testing::IsEmpty;
+using testing::Not;
+
+constexpr const char kTriple[] = "powerpc64le-unknown-linux";
+
+class PowerPCTargetTest : public ::testing::Test {
+protected:
+  PowerPCTargetTest()
+      : ExegesisTarget_(ExegesisTarget::lookup(llvm::Triple(kTriple))) {
+    EXPECT_THAT(ExegesisTarget_, NotNull());
+    std::string error;
+    Target_ = llvm::TargetRegistry::lookupTarget(kTriple, error);
+    EXPECT_THAT(Target_, NotNull());
+  }
+  static void SetUpTestCase() {
+    LLVMInitializePowerPCTargetInfo();
+    LLVMInitializePowerPCTarget();
+    LLVMInitializePowerPCTargetMC();
+    InitializePowerPCExegesisTarget();
+  }
+
+  const llvm::Target *Target_;
+  const ExegesisTarget *const ExegesisTarget_;
+};
+
+TEST_F(PowerPCTargetTest, SetRegToConstant) {
+  const std::unique_ptr<llvm::MCSubtargetInfo> STI(
+      Target_->createMCSubtargetInfo(kTriple, "generic", ""));
+  const auto Insts =
+      ExegesisTarget_->setRegTo(*STI, llvm::PPC::X0, llvm::APInt());
+  EXPECT_THAT(Insts, Not(IsEmpty()));
+}
+
+} // namespace
+} // namespace exegesis
+} // namespace llvm




More information about the llvm-commits mailing list