[PM] Change the core design of the TTI analysis to use a polymorphic
[oota-llvm.git] / lib / Target / XCore / XCoreTargetTransformInfo.cpp
index 4862138834868bf83c9806949e8cc9418de7c543..d2b152fc82e8432742ec6d86ba1734aa86165fb1 100644 (file)
 ///
 //===----------------------------------------------------------------------===//
 
-#define DEBUG_TYPE "xcoretti"
 #include "XCore.h"
+#include "XCoreTargetMachine.h"
 #include "llvm/Analysis/TargetTransformInfo.h"
+#include "llvm/CodeGen/BasicTTIImpl.h"
 #include "llvm/Support/Debug.h"
-#include "llvm/Target/TargetLowering.h"
 #include "llvm/Target/CostTable.h"
+#include "llvm/Target/TargetLowering.h"
 using namespace llvm;
 
-// Declare the pass initialization routine locally as target-specific passes
-// don't havve a target-wide initialization entry point, and so we rely on the
-// pass constructor initialization.
-namespace llvm {
-void initializeXCoreTTIPass(PassRegistry &);
-}
+#define DEBUG_TYPE "xcoretti"
 
 namespace {
 
-class XCoreTTI : public ImmutablePass, public TargetTransformInfo {
-  const XCoreTargetMachine *TM;
+class XCoreTTIImpl : public BasicTTIImplBase<XCoreTTIImpl> {
+  typedef BasicTTIImplBase<XCoreTTIImpl> BaseT;
+  typedef TargetTransformInfo TTI;
 
 public:
-  XCoreTTI() : ImmutablePass(ID), TM(0) {
-    llvm_unreachable("This pass cannot be directly constructed");
+  explicit XCoreTTIImpl(const XCoreTargetMachine *TM = nullptr) : BaseT(TM) {}
+
+  // Provide value semantics. MSVC requires that we spell all of these out.
+  XCoreTTIImpl(const XCoreTTIImpl &Arg)
+      : BaseT(static_cast<const BaseT &>(Arg)) {}
+  XCoreTTIImpl(XCoreTTIImpl &&Arg)
+      : BaseT(std::move(static_cast<BaseT &>(Arg))) {}
+  XCoreTTIImpl &operator=(const XCoreTTIImpl &RHS) {
+    BaseT::operator=(static_cast<const BaseT &>(RHS));
+    return *this;
   }
-
-  XCoreTTI(const XCoreTargetMachine *TM)
-      : ImmutablePass(ID), TM(TM) {
-    initializeXCoreTTIPass(*PassRegistry::getPassRegistry());
-  }
-
-  virtual void initializePass() {
-    pushTTIStack(this);
+  XCoreTTIImpl &operator=(XCoreTTIImpl &&RHS) {
+    BaseT::operator=(std::move(static_cast<BaseT &>(RHS)));
+    return *this;
   }
 
-  virtual void finalizePass() {
-    popTTIStack();
-  }
-
-  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
-    TargetTransformInfo::getAnalysisUsage(AU);
-  }
-
-  static char ID;
-
-  virtual void *getAdjustedAnalysisPointer(const void *ID) {
-    if (ID == &TargetTransformInfo::ID)
-      return (TargetTransformInfo*)this;
-    return this;
-  }
-
-  unsigned getNumberOfRegisters(bool Vector) const {
+  unsigned getNumberOfRegisters(bool Vector) {
     if (Vector) {
        return 0;
     }
@@ -74,12 +58,7 @@ public:
 
 } // end anonymous namespace
 
-INITIALIZE_AG_PASS(XCoreTTI, TargetTransformInfo, "xcoretti",
-                   "XCore Target Transform Info", true, true, false)
-char XCoreTTI::ID = 0;
-
-
 ImmutablePass *
 llvm::createXCoreTargetTransformInfoPass(const XCoreTargetMachine *TM) {
-  return new XCoreTTI(TM);
+  return new TargetTransformInfoWrapperPass(XCoreTTIImpl(TM));
 }