mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
[SROA] convertValue(): we can have <N x iK> to <M x iQ*> cast
Provided test case crashes otherwise. If NewTy is already DL.getIntPtrType(NewTy), CreateBitCast() won't actually create any bitcast, so we are better off just doing the general thing.
This commit is contained in:
parent
59860824ed
commit
5bd582e3b4
@ -1747,20 +1747,14 @@ static Value *convertValue(const DataLayout &DL, IRBuilderTy &IRB, Value *V,
|
||||
assert(!(isa<IntegerType>(OldTy) && isa<IntegerType>(NewTy)) &&
|
||||
"Integer types must be the exact same to convert.");
|
||||
|
||||
// See if we need inttoptr for this type pair. A cast involving both scalars
|
||||
// and vectors requires and additional bitcast.
|
||||
// See if we need inttoptr for this type pair. May require additional bitcast.
|
||||
if (OldTy->isIntOrIntVectorTy() && NewTy->isPtrOrPtrVectorTy()) {
|
||||
// Expand <2 x i32> to i8* --> <2 x i32> to i64 to i8*
|
||||
if (OldTy->isVectorTy() && !NewTy->isVectorTy())
|
||||
return IRB.CreateIntToPtr(IRB.CreateBitCast(V, DL.getIntPtrType(NewTy)),
|
||||
NewTy);
|
||||
|
||||
// Expand i128 to <2 x i8*> --> i128 to <2 x i64> to <2 x i8*>
|
||||
if (!OldTy->isVectorTy() && NewTy->isVectorTy())
|
||||
return IRB.CreateIntToPtr(IRB.CreateBitCast(V, DL.getIntPtrType(NewTy)),
|
||||
NewTy);
|
||||
|
||||
return IRB.CreateIntToPtr(V, NewTy);
|
||||
// Expand <4 x i32> to <2 x i8*> --> <4 x i32> to <2 x i64> to <2 x i8*>
|
||||
// Directly handle i64 to i8*
|
||||
return IRB.CreateIntToPtr(IRB.CreateBitCast(V, DL.getIntPtrType(NewTy)),
|
||||
NewTy);
|
||||
}
|
||||
|
||||
// See if we need ptrtoint for this type pair. A cast involving both scalars
|
||||
|
@ -34,7 +34,7 @@ define <4 x i32*> @vector_inttoptr({<2 x i64>, <2 x i64>} %x) {
|
||||
}
|
||||
|
||||
define <2 x i64> @vector_ptrtointbitcast({<1 x i32*>, <1 x i32*>} %x) {
|
||||
; CHECK-LABEL: @vector_ptrtointbitcast
|
||||
; CHECK-LABEL: @vector_ptrtointbitcast(
|
||||
%a = alloca {<1 x i32*>, <1 x i32*>}
|
||||
; CHECK-NOT: alloca
|
||||
|
||||
@ -51,3 +51,22 @@ define <2 x i64> @vector_ptrtointbitcast({<1 x i32*>, <1 x i32*>} %x) {
|
||||
|
||||
ret <2 x i64> %vec
|
||||
}
|
||||
|
||||
define <2 x i8*> @vector_inttoptrbitcast_vector({<16 x i8>, <16 x i8>} %x) {
|
||||
; CHECK-LABEL: @vector_inttoptrbitcast_vector(
|
||||
%a = alloca {<16 x i8>, <16 x i8>}
|
||||
; CHECK-NOT: alloca
|
||||
|
||||
store {<16 x i8>, <16 x i8>} %x, {<16 x i8>, <16 x i8>}* %a
|
||||
; CHECK-NOT: store
|
||||
|
||||
%cast = bitcast {<16 x i8>, <16 x i8>}* %a to <2 x i8*>*
|
||||
%vec = load <2 x i8*>, <2 x i8*>* %cast
|
||||
; CHECK-NOT: load
|
||||
; CHECK: extractvalue
|
||||
; CHECK: extractvalue
|
||||
; CHECK: bitcast
|
||||
; CHECK: inttoptr
|
||||
|
||||
ret <2 x i8*> %vec
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user