1 //===-- HexagonTargetTransformInfo.cpp - Hexagon specific TTI pass --------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 /// \file 9 /// This file implements a TargetTransformInfo analysis pass specific to the 10 /// Hexagon target machine. It uses the target's detailed information to provide 11 /// more precise answers to certain TTI queries, while letting the target 12 /// independent and default TTI implementations handle the rest. 13 /// 14 //===----------------------------------------------------------------------===// 15 16 #include "HexagonTargetTransformInfo.h" 17 #include "llvm/IR/Instructions.h" 18 #include "llvm/Support/Debug.h" 19 20 using namespace llvm; 21 22 #define DEBUG_TYPE "hexagontti" 23 24 TargetTransformInfo::PopcntSupportKind 25 HexagonTTIImpl::getPopcntSupport(unsigned IntTyWidthInBit) const { 26 // Return Fast Hardware support as every input < 64 bits will be promoted 27 // to 64 bits. 28 return TargetTransformInfo::PSK_FastHardware; 29 } 30 31 // The Hexagon target can unroll loops with run-time trip counts. 32 void HexagonTTIImpl::getUnrollingPreferences(Loop *L, 33 TTI::UnrollingPreferences &UP) { 34 UP.Runtime = UP.Partial = true; 35 } 36 37 unsigned HexagonTTIImpl::getNumberOfRegisters(bool vector) const { 38 return vector ? 0 : 32; 39 } 40 41 unsigned HexagonTTIImpl::getPrefetchDistance() const { 42 return getST()->getL1PrefetchDistance(); 43 } 44 45 unsigned HexagonTTIImpl::getCacheLineSize() const { 46 return getST()->getL1CacheLineSize(); 47 } 48 49 int HexagonTTIImpl::getUserCost(const User *U) { 50 auto isCastFoldedIntoLoad = [] (const CastInst *CI) -> bool { 51 if (!CI->isIntegerCast()) 52 return false; 53 const LoadInst *LI = dyn_cast<const LoadInst>(CI->getOperand(0)); 54 // Technically, this code could allow multiple uses of the load, and 55 // check if all the uses are the same extension operation, but this 56 // should be sufficient for most cases. 57 if (!LI || !LI->hasOneUse()) 58 return false; 59 60 // Only extensions from an integer type shorter than 32-bit to i32 61 // can be folded into the load. 62 unsigned SBW = CI->getSrcTy()->getIntegerBitWidth(); 63 unsigned DBW = CI->getDestTy()->getIntegerBitWidth(); 64 return DBW == 32 && (SBW < DBW); 65 }; 66 67 if (const CastInst *CI = dyn_cast<const CastInst>(U)) 68 if (isCastFoldedIntoLoad(CI)) 69 return TargetTransformInfo::TCC_Free; 70 return BaseT::getUserCost(U); 71 } 72