XCoreTargetTransformInfo.cpp revision 36b56886974eae4f9c5ebc96befd3e7bfe5de338
1424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)//===-- XCoreTargetTransformInfo.cpp - XCore specific TTI pass ----------------===//
2424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)//
3424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)//
5424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
6424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// License. See LICENSE.TXT for details.
7424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)//
8a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch//===----------------------------------------------------------------------===//
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/// \file
10424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)/// This file implements a TargetTransformInfo analysis pass specific to the
11424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)/// XCore target machine. It uses the target's detailed information to provide
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/// more precise answers to certain TTI queries, while letting the target
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/// independent and default TTI implementations handle the rest.
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)///
15424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)//===----------------------------------------------------------------------===//
16424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
17424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#define DEBUG_TYPE "xcoretti"
18424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "XCore.h"
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "llvm/Analysis/TargetTransformInfo.h"
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "llvm/Support/Debug.h"
21424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "llvm/Target/CostTable.h"
22424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "llvm/Target/TargetLowering.h"
23424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)using namespace llvm;
24424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
25424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Declare the pass initialization routine locally as target-specific passes
26424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// don't havve a target-wide initialization entry point, and so we rely on the
27424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// pass constructor initialization.
28424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace llvm {
29424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void initializeXCoreTTIPass(PassRegistry &);
30424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
31424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
32424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace {
33424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
34424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class XCoreTTI final : public ImmutablePass, public TargetTransformInfo {
35424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)public:
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  XCoreTTI() : ImmutablePass(ID) {
37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    llvm_unreachable("This pass cannot be directly constructed");
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  XCoreTTI(const XCoreTargetMachine *TM)
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : ImmutablePass(ID) {
42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    initializeXCoreTTIPass(*PassRegistry::getPassRegistry());
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void initializePass() override {
46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    pushTTIStack(this);
47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void getAnalysisUsage(AnalysisUsage &AU) const override {
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TargetTransformInfo::getAnalysisUsage(AU);
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  static char ID;
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void *getAdjustedAnalysisPointer(const void *ID) override {
56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (ID == &TargetTransformInfo::ID)
57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      return (TargetTransformInfo*)this;
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return this;
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
61424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  unsigned getNumberOfRegisters(bool Vector) const override {
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (Vector) {
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       return 0;
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return 12;
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // end anonymous namespace
70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)INITIALIZE_AG_PASS(XCoreTTI, TargetTransformInfo, "xcoretti",
72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   "XCore Target Transform Info", true, true, false)
73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)char XCoreTTI::ID = 0;
74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)ImmutablePass *
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)llvm::createXCoreTargetTransformInfoPass(const XCoreTargetMachine *TM) {
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return new XCoreTTI(TM);
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci