mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
Fix CodeGen for vectors of pointers with address spaces.
llvm-svn: 193112
This commit is contained in:
parent
dad904931b
commit
aad9d96b2b
@ -570,14 +570,18 @@ public:
|
||||
/// otherwise it will assert.
|
||||
EVT getValueType(Type *Ty, bool AllowUnknown = false) const {
|
||||
// Lower scalar pointers to native pointer types.
|
||||
if (Ty->isPointerTy()) return getPointerTy(Ty->getPointerAddressSpace());
|
||||
if (PointerType *PTy = dyn_cast<PointerType>(Ty))
|
||||
return getPointerTy(PTy->getAddressSpace());
|
||||
|
||||
if (Ty->isVectorTy()) {
|
||||
VectorType *VTy = cast<VectorType>(Ty);
|
||||
Type *Elm = VTy->getElementType();
|
||||
// Lower vectors of pointers to native pointer types.
|
||||
if (Elm->isPointerTy())
|
||||
Elm = EVT(PointerTy).getTypeForEVT(Ty->getContext());
|
||||
if (PointerType *PT = dyn_cast<PointerType>(Elm)) {
|
||||
EVT PointerTy(getPointerTy(PT->getAddressSpace()));
|
||||
Elm = PointerTy.getTypeForEVT(Ty->getContext());
|
||||
}
|
||||
|
||||
return EVT::getVectorVT(Ty->getContext(), EVT::getEVT(Elm, false),
|
||||
VTy->getNumElements());
|
||||
}
|
||||
|
@ -8,3 +8,33 @@ define void @use_gep_address_space([1024 x i32] addrspace(3)* %array) nounwind {
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @gep_as_vector_v4(<4 x [1024 x i32] addrspace(3)*> %array) nounwind {
|
||||
; CHECK-LABEL: @gep_as_vector_v4:
|
||||
; CHECK: V_ADD_I32
|
||||
; CHECK: V_ADD_I32
|
||||
; CHECK: V_ADD_I32
|
||||
; CHECK: V_ADD_I32
|
||||
%p = getelementptr <4 x [1024 x i32] addrspace(3)*> %array, <4 x i16> zeroinitializer, <4 x i16> <i16 16, i16 16, i16 16, i16 16>
|
||||
%p0 = extractelement <4 x i32 addrspace(3)*> %p, i32 0
|
||||
%p1 = extractelement <4 x i32 addrspace(3)*> %p, i32 1
|
||||
%p2 = extractelement <4 x i32 addrspace(3)*> %p, i32 2
|
||||
%p3 = extractelement <4 x i32 addrspace(3)*> %p, i32 3
|
||||
store i32 99, i32 addrspace(3)* %p0
|
||||
store i32 99, i32 addrspace(3)* %p1
|
||||
store i32 99, i32 addrspace(3)* %p2
|
||||
store i32 99, i32 addrspace(3)* %p3
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @gep_as_vector_v2(<2 x [1024 x i32] addrspace(3)*> %array) nounwind {
|
||||
; CHECK-LABEL: @gep_as_vector_v2:
|
||||
; CHECK: V_ADD_I32
|
||||
; CHECK: V_ADD_I32
|
||||
%p = getelementptr <2 x [1024 x i32] addrspace(3)*> %array, <2 x i16> zeroinitializer, <2 x i16> <i16 16, i16 16>
|
||||
%p0 = extractelement <2 x i32 addrspace(3)*> %p, i32 0
|
||||
%p1 = extractelement <2 x i32 addrspace(3)*> %p, i32 1
|
||||
store i32 99, i32 addrspace(3)* %p0
|
||||
store i32 99, i32 addrspace(3)* %p1
|
||||
ret void
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user