1251875Speter//===-- XCoreTargetTransformInfo.cpp - XCore specific TTI pass ----------------===// 2251875Speter// 3251875Speter// The LLVM Compiler Infrastructure 4251875Speter// 5251875Speter// This file is distributed under the University of Illinois Open Source 6251875Speter// License. See LICENSE.TXT for details. 7251875Speter// 8251875Speter//===----------------------------------------------------------------------===// 9251875Speter/// \file 10251875Speter/// This file implements a TargetTransformInfo analysis pass specific to the 11251875Speter/// XCore target machine. It uses the target's detailed information to provide 12251875Speter/// more precise answers to certain TTI queries, while letting the target 13251875Speter/// independent and default TTI implementations handle the rest. 14251875Speter/// 15251875Speter//===----------------------------------------------------------------------===// 16251875Speter 17251875Speter#define DEBUG_TYPE "xcoretti" 18251875Speter#include "XCore.h" 19251875Speter#include "llvm/Analysis/TargetTransformInfo.h" 20251875Speter#include "llvm/Support/Debug.h" 21251875Speter#include "llvm/Target/TargetLowering.h" 22251875Speter#include "llvm/Target/CostTable.h" 23251875Speterusing namespace llvm; 24251875Speter 25251875Speter// Declare the pass initialization routine locally as target-specific passes 26251875Speter// don't havve a target-wide initialization entry point, and so we rely on the 27251875Speter// pass constructor initialization. 28251875Speternamespace llvm { 29251875Spetervoid initializeXCoreTTIPass(PassRegistry &); 30251875Speter} 31251875Speter 32251875Speternamespace { 33251875Speter 34251875Speterclass XCoreTTI : public ImmutablePass, public TargetTransformInfo { 35251875Speterpublic: 36251875Speter XCoreTTI() : ImmutablePass(ID) { 37251875Speter llvm_unreachable("This pass cannot be directly constructed"); 38251875Speter } 39251875Speter 40251875Speter XCoreTTI(const XCoreTargetMachine *TM) 41251875Speter : ImmutablePass(ID) { 42251875Speter initializeXCoreTTIPass(*PassRegistry::getPassRegistry()); 43251875Speter } 44251875Speter 45251875Speter virtual void initializePass() { 46251875Speter pushTTIStack(this); 47251875Speter } 48251875Speter 49251875Speter virtual void finalizePass() { 50251875Speter popTTIStack(); 51251875Speter } 52251875Speter 53251875Speter virtual void getAnalysisUsage(AnalysisUsage &AU) const { 54251875Speter TargetTransformInfo::getAnalysisUsage(AU); 55251875Speter } 56251875Speter 57251875Speter static char ID; 58251875Speter 59251875Speter virtual void *getAdjustedAnalysisPointer(const void *ID) { 60251875Speter if (ID == &TargetTransformInfo::ID) 61251875Speter return (TargetTransformInfo*)this; 62251875Speter return this; 63251875Speter } 64251875Speter 65251875Speter unsigned getNumberOfRegisters(bool Vector) const { 66251875Speter if (Vector) { 67251875Speter return 0; 68251875Speter } 69251875Speter return 12; 70251875Speter } 71251875Speter}; 72251875Speter 73251875Speter} // end anonymous namespace 74251875Speter 75251875SpeterINITIALIZE_AG_PASS(XCoreTTI, TargetTransformInfo, "xcoretti", 76251875Speter "XCore Target Transform Info", true, true, false) 77251875Speterchar XCoreTTI::ID = 0; 78251875Speter 79251875Speter 80251875SpeterImmutablePass * 81251875Speterllvm::createXCoreTargetTransformInfoPass(const XCoreTargetMachine *TM) { 82251875Speter return new XCoreTTI(TM); 83251875Speter} 84251875Speter