mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-10-09 04:14:11 +00:00
[Hexagon] Consider zext/sext of a load to i32 to be free
llvm-svn: 279248
This commit is contained in:
parent
b38195c1a8
commit
db019ae801
@ -14,6 +14,7 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "HexagonTargetTransformInfo.h"
|
||||
#include "llvm/IR/Instructions.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
|
||||
using namespace llvm;
|
||||
@ -44,3 +45,27 @@ unsigned HexagonTTIImpl::getPrefetchDistance() const {
|
||||
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);
|
||||
}
|
||||
|
@ -67,6 +67,8 @@ public:
|
||||
unsigned getNumberOfRegisters(bool vector) const;
|
||||
|
||||
/// @}
|
||||
|
||||
int getUserCost(const User *U);
|
||||
};
|
||||
|
||||
} // end namespace llvm
|
||||
|
Loading…
Reference in New Issue
Block a user