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