mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-10 04:33:40 +00:00
[SROA] Use the correct index integer size in GEPs through non-default
address spaces. This isn't really a correctness issue (the values are truncated) but its much cleaner. Patch by Matt Arsenault! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202252 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
18eab50e99
commit
2b442bffcb
@ -1290,6 +1290,9 @@ static Value *getNaturalGEPWithType(IRBuilderTy &IRB, const DataLayout &DL,
|
|||||||
if (Ty == TargetTy)
|
if (Ty == TargetTy)
|
||||||
return buildGEP(IRB, BasePtr, Indices, NamePrefix);
|
return buildGEP(IRB, BasePtr, Indices, NamePrefix);
|
||||||
|
|
||||||
|
// Pointer size to use for the indices.
|
||||||
|
unsigned PtrSize = DL.getPointerTypeSizeInBits(BasePtr->getType());
|
||||||
|
|
||||||
// See if we can descend into a struct and locate a field with the correct
|
// See if we can descend into a struct and locate a field with the correct
|
||||||
// type.
|
// type.
|
||||||
unsigned NumLayers = 0;
|
unsigned NumLayers = 0;
|
||||||
@ -1297,11 +1300,13 @@ static Value *getNaturalGEPWithType(IRBuilderTy &IRB, const DataLayout &DL,
|
|||||||
do {
|
do {
|
||||||
if (ElementTy->isPointerTy())
|
if (ElementTy->isPointerTy())
|
||||||
break;
|
break;
|
||||||
if (SequentialType *SeqTy = dyn_cast<SequentialType>(ElementTy)) {
|
|
||||||
ElementTy = SeqTy->getElementType();
|
if (ArrayType *ArrayTy = dyn_cast<ArrayType>(ElementTy)) {
|
||||||
// Note that we use the default address space as this index is over an
|
ElementTy = ArrayTy->getElementType();
|
||||||
// array or a vector, not a pointer.
|
Indices.push_back(IRB.getIntN(PtrSize, 0));
|
||||||
Indices.push_back(IRB.getInt(APInt(DL.getPointerSizeInBits(0), 0)));
|
} else if (VectorType *VectorTy = dyn_cast<VectorType>(ElementTy)) {
|
||||||
|
ElementTy = VectorTy->getElementType();
|
||||||
|
Indices.push_back(IRB.getInt32(0));
|
||||||
} else if (StructType *STy = dyn_cast<StructType>(ElementTy)) {
|
} else if (StructType *STy = dyn_cast<StructType>(ElementTy)) {
|
||||||
if (STy->element_begin() == STy->element_end())
|
if (STy->element_begin() == STy->element_end())
|
||||||
break; // Nothing left to descend into.
|
break; // Nothing left to descend into.
|
||||||
|
@ -1160,7 +1160,7 @@ entry:
|
|||||||
; CHECK: alloca [16 x i8], align 8
|
; CHECK: alloca [16 x i8], align 8
|
||||||
|
|
||||||
%gep = getelementptr inbounds { [16 x i8] } addrspace(1)* %ptr, i64 -1
|
%gep = getelementptr inbounds { [16 x i8] } addrspace(1)* %ptr, i64 -1
|
||||||
; CHECK-NEXT: getelementptr inbounds { [16 x i8] } addrspace(1)* %ptr, i16 -1, i32 0, i64 0
|
; CHECK-NEXT: getelementptr inbounds { [16 x i8] } addrspace(1)* %ptr, i16 -1, i32 0, i16 0
|
||||||
|
|
||||||
%cast1 = bitcast { [16 x i8 ] } addrspace(1)* %gep to i8 addrspace(1)*
|
%cast1 = bitcast { [16 x i8 ] } addrspace(1)* %gep to i8 addrspace(1)*
|
||||||
%cast2 = bitcast { [16 x i8 ] }* %a to i8*
|
%cast2 = bitcast { [16 x i8 ] }* %a to i8*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user