//===- llvm/Analysis/TargetTransformInfo.cpp ------------------------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #define DEBUG_TYPE "tti" #include "llvm/Analysis/TargetTransformInfo.h" #include "llvm/Support/ErrorHandling.h" using namespace llvm; // Setup the analysis group to manage the TargetTransformInfo passes. INITIALIZE_ANALYSIS_GROUP(TargetTransformInfo, "Target Information", NoTTI) char TargetTransformInfo::ID = 0; TargetTransformInfo::~TargetTransformInfo() { } void TargetTransformInfo::pushTTIStack(Pass *P) { TopTTI = this; PrevTTI = &P->getAnalysis(); // Walk up the chain and update the top TTI pointer. for (TargetTransformInfo *PTTI = PrevTTI; PTTI; PTTI = PTTI->PrevTTI) PTTI->TopTTI = this; } void TargetTransformInfo::popTTIStack() { TopTTI = 0; // Walk up the chain and update the top TTI pointer. for (TargetTransformInfo *PTTI = PrevTTI; PTTI; PTTI = PTTI->PrevTTI) PTTI->TopTTI = PrevTTI; PrevTTI = 0; } void TargetTransformInfo::getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired(); } bool TargetTransformInfo::isLegalAddImmediate(int64_t Imm) const { return PrevTTI->isLegalAddImmediate(Imm); } bool TargetTransformInfo::isLegalICmpImmediate(int64_t Imm) const { return PrevTTI->isLegalICmpImmediate(Imm); } bool TargetTransformInfo::isLegalAddressingMode(Type *Ty, GlobalValue *BaseGV, int64_t BaseOffset, bool HasBaseReg, int64_t Scale) const { return PrevTTI->isLegalAddressingMode(Ty, BaseGV, BaseOffset, HasBaseReg, Scale); } bool TargetTransformInfo::isTruncateFree(Type *Ty1, Type *Ty2) const { return PrevTTI->isTruncateFree(Ty1, Ty2); } bool TargetTransformInfo::isTypeLegal(Type *Ty) const { return PrevTTI->isTypeLegal(Ty); } unsigned TargetTransformInfo::getJumpBufAlignment() const { return PrevTTI->getJumpBufAlignment(); } unsigned TargetTransformInfo::getJumpBufSize() const { return PrevTTI->getJumpBufSize(); } bool TargetTransformInfo::shouldBuildLookupTables() const { return PrevTTI->shouldBuildLookupTables(); } TargetTransformInfo::PopcntSupportKind TargetTransformInfo::getPopcntSupport(unsigned IntTyWidthInBit) const { return PrevTTI->getPopcntSupport(IntTyWidthInBit); } unsigned TargetTransformInfo::getIntImmCost(const APInt &Imm, Type *Ty) const { return PrevTTI->getIntImmCost(Imm, Ty); } unsigned TargetTransformInfo::getNumberOfRegisters(bool Vector) const { return PrevTTI->getNumberOfRegisters(Vector); } unsigned TargetTransformInfo::getArithmeticInstrCost(unsigned Opcode, Type *Ty) const { return PrevTTI->getArithmeticInstrCost(Opcode, Ty); } unsigned TargetTransformInfo::getShuffleCost(ShuffleKind Kind, Type *Tp, int Index, Type *SubTp) const { return PrevTTI->getShuffleCost(Kind, Tp, Index, SubTp); } unsigned TargetTransformInfo::getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src) const { return PrevTTI->getCastInstrCost(Opcode, Dst, Src); } unsigned TargetTransformInfo::getCFInstrCost(unsigned Opcode) const { return PrevTTI->getCFInstrCost(Opcode); } unsigned TargetTransformInfo::getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy) const { return PrevTTI->getCmpSelInstrCost(Opcode, ValTy, CondTy); } unsigned TargetTransformInfo::getVectorInstrCost(unsigned Opcode, Type *Val, unsigned Index) const { return PrevTTI->getVectorInstrCost(Opcode, Val, Index); } unsigned TargetTransformInfo::getMemoryOpCost(unsigned Opcode, Type *Src, unsigned Alignment, unsigned AddressSpace) const { return PrevTTI->getMemoryOpCost(Opcode, Src, Alignment, AddressSpace); ; } unsigned TargetTransformInfo::getIntrinsicInstrCost(Intrinsic::ID ID, Type *RetTy, ArrayRef Tys) const { return PrevTTI->getIntrinsicInstrCost(ID, RetTy, Tys); } unsigned TargetTransformInfo::getNumberOfParts(Type *Tp) const { return PrevTTI->getNumberOfParts(Tp); } namespace { struct NoTTI : ImmutablePass, TargetTransformInfo { NoTTI() : ImmutablePass(ID) { initializeNoTTIPass(*PassRegistry::getPassRegistry()); } virtual void initializePass() { // Note that this subclass is special, and must *not* call initializeTTI as // it does not chain. PrevTTI = 0; } virtual void getAnalysisUsage(AnalysisUsage &AU) const { // Note that this subclass is special, and must *not* call // TTI::getAnalysisUsage as it breaks the recursion. } /// Pass identification. static char ID; /// Provide necessary pointer adjustments for the two base classes. virtual void *getAdjustedAnalysisPointer(const void *ID) { if (ID == &TargetTransformInfo::ID) return (TargetTransformInfo*)this; return this; } bool isLegalAddImmediate(int64_t Imm) const { return false; } bool isLegalICmpImmediate(int64_t Imm) const { return false; } bool isLegalAddressingMode(Type *Ty, GlobalValue *BaseGV, int64_t BaseOffset, bool HasBaseReg, int64_t Scale) const { return false; } bool isTruncateFree(Type *Ty1, Type *Ty2) const { return false; } bool isTypeLegal(Type *Ty) const { return false; } unsigned getJumpBufAlignment() const { return 0; } unsigned getJumpBufSize() const { return 0; } bool shouldBuildLookupTables() const { return true; } PopcntSupportKind getPopcntSupport(unsigned IntTyWidthInBit) const { return PSK_Software; } unsigned getIntImmCost(const APInt &Imm, Type *Ty) const { return 1; } unsigned getNumberOfRegisters(bool Vector) const { return 8; } unsigned getArithmeticInstrCost(unsigned Opcode, Type *Ty) const { return 1; } unsigned getShuffleCost(ShuffleKind Kind, Type *Tp, int Index = 0, Type *SubTp = 0) const { return 1; } unsigned getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src) const { return 1; } unsigned getCFInstrCost(unsigned Opcode) const { return 1; } unsigned getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy = 0) const { return 1; } unsigned getVectorInstrCost(unsigned Opcode, Type *Val, unsigned Index = -1) const { return 1; } unsigned getMemoryOpCost(unsigned Opcode, Type *Src, unsigned Alignment, unsigned AddressSpace) const { return 1; } unsigned getIntrinsicInstrCost(Intrinsic::ID ID, Type *RetTy, ArrayRef Tys) const { return 1; } unsigned getNumberOfParts(Type *Tp) const { return 0; } }; } // end anonymous namespace INITIALIZE_AG_PASS(NoTTI, TargetTransformInfo, "notti", "No target information", true, true, true) char NoTTI::ID = 0; ImmutablePass *llvm::createNoTargetTransformInfoPass() { return new NoTTI(); }