mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-26 12:20:42 +00:00
Add in the first iteration of support for llvm/clang/lldb to allow variable per address space pointer sizes to be optimized correctly.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@165726 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -1293,15 +1293,16 @@ Instruction *InstCombiner::visitIntToPtr(IntToPtrInst &CI) {
|
||||
// If the source integer type is not the intptr_t type for this target, do a
|
||||
// trunc or zext to the intptr_t type, then inttoptr of it. This allows the
|
||||
// cast to be exposed to other transforms.
|
||||
unsigned AS = CI.getAddressSpace();
|
||||
if (TD) {
|
||||
if (CI.getOperand(0)->getType()->getScalarSizeInBits() >
|
||||
TD->getPointerSizeInBits()) {
|
||||
TD->getPointerSizeInBits(AS)) {
|
||||
Value *P = Builder->CreateTrunc(CI.getOperand(0),
|
||||
TD->getIntPtrType(CI.getContext()));
|
||||
return new IntToPtrInst(P, CI.getType());
|
||||
}
|
||||
if (CI.getOperand(0)->getType()->getScalarSizeInBits() <
|
||||
TD->getPointerSizeInBits()) {
|
||||
TD->getPointerSizeInBits(AS)) {
|
||||
Value *P = Builder->CreateZExt(CI.getOperand(0),
|
||||
TD->getIntPtrType(CI.getContext()));
|
||||
return new IntToPtrInst(P, CI.getType());
|
||||
@@ -1368,13 +1369,14 @@ Instruction *InstCombiner::visitPtrToInt(PtrToIntInst &CI) {
|
||||
// If the destination integer type is not the intptr_t type for this target,
|
||||
// do a ptrtoint to intptr_t then do a trunc or zext. This allows the cast
|
||||
// to be exposed to other transforms.
|
||||
unsigned AS = CI.getPointerAddressSpace();
|
||||
if (TD) {
|
||||
if (CI.getType()->getScalarSizeInBits() < TD->getPointerSizeInBits()) {
|
||||
if (CI.getType()->getScalarSizeInBits() < TD->getPointerSizeInBits(AS)) {
|
||||
Value *P = Builder->CreatePtrToInt(CI.getOperand(0),
|
||||
TD->getIntPtrType(CI.getContext()));
|
||||
return new TruncInst(P, CI.getType());
|
||||
}
|
||||
if (CI.getType()->getScalarSizeInBits() > TD->getPointerSizeInBits()) {
|
||||
if (CI.getType()->getScalarSizeInBits() > TD->getPointerSizeInBits(AS)) {
|
||||
Value *P = Builder->CreatePtrToInt(CI.getOperand(0),
|
||||
TD->getIntPtrType(CI.getContext()));
|
||||
return new ZExtInst(P, CI.getType());
|
||||
|
||||
@@ -365,11 +365,12 @@ FoldCmpLoadFromIndexedGlobal(GetElementPtrInst *GEP, GlobalVariable *GV,
|
||||
// order the state machines in complexity of the generated code.
|
||||
Value *Idx = GEP->getOperand(2);
|
||||
|
||||
unsigned AS = GEP->getPointerAddressSpace();
|
||||
// If the index is larger than the pointer size of the target, truncate the
|
||||
// index down like the GEP would do implicitly. We don't have to do this for
|
||||
// an inbounds GEP because the index can't be out of range.
|
||||
if (!GEP->isInBounds() &&
|
||||
Idx->getType()->getPrimitiveSizeInBits() > TD->getPointerSizeInBits())
|
||||
Idx->getType()->getPrimitiveSizeInBits() > TD->getPointerSizeInBits(AS))
|
||||
Idx = Builder->CreateTrunc(Idx, TD->getIntPtrType(Idx->getContext()));
|
||||
|
||||
// If the comparison is only true for one or two elements, emit direct
|
||||
@@ -528,10 +529,11 @@ static Value *EvaluateGEPOffsetExpression(User *GEP, InstCombiner &IC) {
|
||||
}
|
||||
}
|
||||
|
||||
unsigned AS = cast<GetElementPtrInst>(GEP)->getPointerAddressSpace();
|
||||
// Okay, we know we have a single variable index, which must be a
|
||||
// pointer/array/vector index. If there is no offset, life is simple, return
|
||||
// the index.
|
||||
unsigned IntPtrWidth = TD.getPointerSizeInBits();
|
||||
unsigned IntPtrWidth = TD.getPointerSizeInBits(AS);
|
||||
if (Offset == 0) {
|
||||
// Cast to intptrty in case a truncation occurs. If an extension is needed,
|
||||
// we don't need to bother extending: the extension won't affect where the
|
||||
@@ -1552,7 +1554,8 @@ Instruction *InstCombiner::visitICmpInstWithCastAndCast(ICmpInst &ICI) {
|
||||
// Turn icmp (ptrtoint x), (ptrtoint/c) into a compare of the input if the
|
||||
// integer type is the same size as the pointer type.
|
||||
if (TD && LHSCI->getOpcode() == Instruction::PtrToInt &&
|
||||
TD->getPointerSizeInBits() ==
|
||||
TD->getPointerSizeInBits(
|
||||
cast<PtrToIntInst>(LHSCI)->getPointerAddressSpace()) ==
|
||||
cast<IntegerType>(DestTy)->getBitWidth()) {
|
||||
Value *RHSOp = 0;
|
||||
if (Constant *RHSC = dyn_cast<Constant>(ICI.getOperand(1))) {
|
||||
|
||||
@@ -742,7 +742,7 @@ bool AddressSanitizer::runOnModule(Module &M) {
|
||||
BL.reset(new BlackList(ClBlackListFile));
|
||||
|
||||
C = &(M.getContext());
|
||||
LongSize = TD->getPointerSizeInBits();
|
||||
LongSize = TD->getPointerSizeInBits(0);
|
||||
IntptrTy = Type::getIntNTy(*C, LongSize);
|
||||
IntptrPtrTy = PointerType::get(IntptrTy, 0);
|
||||
|
||||
|
||||
@@ -174,10 +174,11 @@ bool MemsetRange::isProfitableToUseMemset(const DataLayout &TD) const {
|
||||
// this width can be stored. 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 AS = cast<StoreInst>(TheStores[0])->getPointerAddressSpace();
|
||||
unsigned NumPointerStores = Bytes/TD.getPointerSize(AS);
|
||||
|
||||
// Assume the remaining bytes if any are done a byte at a time.
|
||||
unsigned NumByteStores = Bytes - NumPointerStores*TD.getPointerSize();
|
||||
unsigned NumByteStores = Bytes - NumPointerStores*TD.getPointerSize(AS);
|
||||
|
||||
// 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
|
||||
|
||||
@@ -447,6 +447,7 @@ protected:
|
||||
|
||||
bool computeConstantGEPOffset(GetElementPtrInst &GEPI, int64_t &GEPOffset) {
|
||||
GEPOffset = Offset;
|
||||
unsigned int AS = GEPI.getPointerAddressSpace();
|
||||
for (gep_type_iterator GTI = gep_type_begin(GEPI), GTE = gep_type_end(GEPI);
|
||||
GTI != GTE; ++GTI) {
|
||||
ConstantInt *OpC = dyn_cast<ConstantInt>(GTI.getOperand());
|
||||
@@ -476,7 +477,7 @@ protected:
|
||||
continue;
|
||||
}
|
||||
|
||||
APInt Index = OpC->getValue().sextOrTrunc(TD.getPointerSizeInBits());
|
||||
APInt Index = OpC->getValue().sextOrTrunc(TD.getPointerSizeInBits(AS));
|
||||
Index *= APInt(Index.getBitWidth(),
|
||||
TD.getTypeAllocSize(GTI.getIndexedType()));
|
||||
Index += APInt(Index.getBitWidth(), (uint64_t)GEPOffset,
|
||||
@@ -1784,7 +1785,9 @@ static Value *getNaturalGEPWithType(IRBuilder<> &IRB, const DataLayout &TD,
|
||||
break;
|
||||
if (SequentialType *SeqTy = dyn_cast<SequentialType>(ElementTy)) {
|
||||
ElementTy = SeqTy->getElementType();
|
||||
Indices.push_back(IRB.getInt(APInt(TD.getPointerSizeInBits(), 0)));
|
||||
Indices.push_back(IRB.getInt(APInt(TD.getPointerSizeInBits(
|
||||
ElementTy->isPointerTy() ?
|
||||
cast<PointerType>(ElementTy)->getAddressSpace(): 0), 0)));
|
||||
} else if (StructType *STy = dyn_cast<StructType>(ElementTy)) {
|
||||
if (STy->element_begin() == STy->element_end())
|
||||
break; // Nothing left to descend into.
|
||||
@@ -2239,7 +2242,8 @@ private:
|
||||
|
||||
Value *getAdjustedAllocaPtr(IRBuilder<> &IRB, Type *PointerTy) {
|
||||
assert(BeginOffset >= NewAllocaBeginOffset);
|
||||
APInt Offset(TD.getPointerSizeInBits(), BeginOffset - NewAllocaBeginOffset);
|
||||
unsigned AS = cast<PointerType>(PointerTy)->getAddressSpace();
|
||||
APInt Offset(TD.getPointerSizeInBits(AS), BeginOffset - NewAllocaBeginOffset);
|
||||
return getAdjustedPtr(IRB, TD, &NewAI, Offset, PointerTy, getName(""));
|
||||
}
|
||||
|
||||
@@ -2578,8 +2582,10 @@ private:
|
||||
const AllocaPartitioning::MemTransferOffsets &MTO
|
||||
= P.getMemTransferOffsets(II);
|
||||
|
||||
assert(OldPtr->getType()->isPointerTy() && "Must be a pointer type!");
|
||||
unsigned AS = cast<PointerType>(OldPtr->getType())->getAddressSpace();
|
||||
// Compute the relative offset within the transfer.
|
||||
unsigned IntPtrWidth = TD.getPointerSizeInBits();
|
||||
unsigned IntPtrWidth = TD.getPointerSizeInBits(AS);
|
||||
APInt RelOffset(IntPtrWidth, BeginOffset - (IsDest ? MTO.DestBegin
|
||||
: MTO.SourceBegin));
|
||||
|
||||
|
||||
@@ -806,7 +806,8 @@ unsigned llvm::getOrEnforceKnownAlignment(Value *V, unsigned PrefAlign,
|
||||
const DataLayout *TD) {
|
||||
assert(V->getType()->isPointerTy() &&
|
||||
"getOrEnforceKnownAlignment expects a pointer!");
|
||||
unsigned BitWidth = TD ? TD->getPointerSizeInBits() : 64;
|
||||
unsigned AS = cast<PointerType>(V->getType())->getAddressSpace();
|
||||
unsigned BitWidth = TD ? TD->getPointerSizeInBits(AS) : 64;
|
||||
APInt KnownZero(BitWidth, 0), KnownOne(BitWidth, 0);
|
||||
ComputeMaskedBits(V, KnownZero, KnownOne, TD);
|
||||
unsigned TrailZ = KnownZero.countTrailingOnes();
|
||||
|
||||
Reference in New Issue
Block a user