mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-02 07:11:49 +00:00
MemCpyOptimizer: Use max legal int size instead of pointer size
If there are no legal integers, assume 1 byte. This makes more sense than using the pointer size as a guess for the maximum GPR width. It is conceivable to want to use some 64-bit pointers on a target where 64-bit integers aren't legal. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@190817 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0c190ad93f
commit
4b28ee2088
@ -369,6 +369,17 @@ public:
|
||||
/// least as big as Width bits.
|
||||
Type *getSmallestLegalIntType(LLVMContext &C, unsigned Width = 0) const;
|
||||
|
||||
/// getLargestLegalIntType - Return the largest legal integer type, or null if
|
||||
/// none are set.
|
||||
Type *getLargestLegalIntType(LLVMContext &C) const {
|
||||
unsigned LargestSize = getLargestLegalIntTypeSize();
|
||||
return (LargestSize == 0) ? 0 : Type::getIntNTy(C, LargestSize);
|
||||
}
|
||||
|
||||
/// getLargestLegalIntType - Return the size of largest legal integer type
|
||||
/// size, or 0 if none are set.
|
||||
unsigned getLargestLegalIntTypeSize() const;
|
||||
|
||||
/// getIndexedOffset - return the offset from the beginning of the type for
|
||||
/// the specified indices. This is used to implement getelementptr.
|
||||
uint64_t getIndexedOffset(Type *Ty, ArrayRef<Value *> Indices) const;
|
||||
|
@ -629,6 +629,13 @@ Type *DataLayout::getSmallestLegalIntType(LLVMContext &C, unsigned Width) const
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned DataLayout::getLargestLegalIntTypeSize() const {
|
||||
unsigned MaxWidth = 0;
|
||||
for (unsigned i = 0, e = (unsigned)LegalIntWidths.size(); i != e; ++i)
|
||||
MaxWidth = std::max<unsigned>(MaxWidth, LegalIntWidths[i]);
|
||||
return MaxWidth;
|
||||
}
|
||||
|
||||
uint64_t DataLayout::getIndexedOffset(Type *ptrTy,
|
||||
ArrayRef<Value *> Indices) const {
|
||||
Type *Ty = ptrTy;
|
||||
|
@ -170,14 +170,17 @@ bool MemsetRange::isProfitableToUseMemset(const DataLayout &TD) const {
|
||||
// pessimize the llvm optimizer.
|
||||
//
|
||||
// Since we don't have perfect knowledge here, make some assumptions: assume
|
||||
// the maximum GPR width is the same size as the pointer size and assume that
|
||||
// this width can be stored. If so, check to see whether we will end up
|
||||
// actually reducing the number of stores used.
|
||||
// the maximum GPR width is the same size as the largest legal integer
|
||||
// size. If so, check to see whether we will end up actually reducing the
|
||||
// number of stores used.
|
||||
unsigned Bytes = unsigned(End-Start);
|
||||
unsigned NumPointerStores = Bytes/TD.getPointerSize();
|
||||
unsigned MaxIntSize = TD.getLargestLegalIntTypeSize();
|
||||
if (MaxIntSize == 0)
|
||||
MaxIntSize = 1;
|
||||
unsigned NumPointerStores = Bytes / MaxIntSize;
|
||||
|
||||
// Assume the remaining bytes if any are done a byte at a time.
|
||||
unsigned NumByteStores = Bytes - NumPointerStores*TD.getPointerSize();
|
||||
unsigned NumByteStores = Bytes - NumPointerStores * MaxIntSize;
|
||||
|
||||
// If we will reduce the # stores (according to this heuristic), do the
|
||||
// transformation. This encourages merging 4 x i8 -> i32 and 2 x i16 -> i32
|
||||
|
Loading…
Reference in New Issue
Block a user