diff options
Diffstat (limited to 'contrib/llvm/lib/Target/Hexagon/HexagonTargetTransformInfo.cpp')
-rw-r--r-- | contrib/llvm/lib/Target/Hexagon/HexagonTargetTransformInfo.cpp | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/contrib/llvm/lib/Target/Hexagon/HexagonTargetTransformInfo.cpp b/contrib/llvm/lib/Target/Hexagon/HexagonTargetTransformInfo.cpp index a05443e..d578bfa 100644 --- a/contrib/llvm/lib/Target/Hexagon/HexagonTargetTransformInfo.cpp +++ b/contrib/llvm/lib/Target/Hexagon/HexagonTargetTransformInfo.cpp @@ -14,6 +14,7 @@ //===----------------------------------------------------------------------===// #include "HexagonTargetTransformInfo.h" +#include "llvm/IR/Instructions.h" #include "llvm/Support/Debug.h" using namespace llvm; @@ -36,3 +37,35 @@ void HexagonTTIImpl::getUnrollingPreferences(Loop *L, unsigned HexagonTTIImpl::getNumberOfRegisters(bool vector) const { return vector ? 0 : 32; } + +unsigned HexagonTTIImpl::getPrefetchDistance() const { + return getST()->getL1PrefetchDistance(); +} + +unsigned HexagonTTIImpl::getCacheLineSize() const { + return getST()->getL1CacheLineSize(); +} + +int HexagonTTIImpl::getUserCost(const User *U) { + auto isCastFoldedIntoLoad = [] (const CastInst *CI) -> bool { + if (!CI->isIntegerCast()) + return false; + const LoadInst *LI = dyn_cast<const LoadInst>(CI->getOperand(0)); + // Technically, this code could allow multiple uses of the load, and + // check if all the uses are the same extension operation, but this + // should be sufficient for most cases. + if (!LI || !LI->hasOneUse()) + return false; + + // Only extensions from an integer type shorter than 32-bit to i32 + // can be folded into the load. + unsigned SBW = CI->getSrcTy()->getIntegerBitWidth(); + unsigned DBW = CI->getDestTy()->getIntegerBitWidth(); + return DBW == 32 && (SBW < DBW); + }; + + if (const CastInst *CI = dyn_cast<const CastInst>(U)) + if (isCastFoldedIntoLoad(CI)) + return TargetTransformInfo::TCC_Free; + return BaseT::getUserCost(U); +} |