[PATCH] D32608: SROA: Use correct address space when splitting loads (PR26154)
Hans Wennborg via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon May 1 15:28:48 PDT 2017
hans updated this revision to Diff 97349.
hans added a comment.
Cleaning up and moving test into address-spaces.ll.
https://reviews.llvm.org/D32608
Files:
lib/Transforms/Scalar/SROA.cpp
test/Transforms/SROA/address-spaces.ll
Index: test/Transforms/SROA/address-spaces.ll
===================================================================
--- test/Transforms/SROA/address-spaces.ll
+++ test/Transforms/SROA/address-spaces.ll
@@ -83,3 +83,33 @@
store i32 addrspace(3)* @l, i32 addrspace(3)** %3, align 8
ret void
}
+
+%pr26154.S = type { <4 x i32>, <3 x i8> }
+
+; Just check that we don't crash due to using the wrong address space when
+; splitting the load or store.
+; CHECK-LABEL: pr26154
+; CHECK: ret i8
+
+define i8 @pr26154(%pr26154.S addrspace(1)* %arg) {
+bb:
+ %a = alloca %pr26154.S, align 16
+ %b = alloca %pr26154.S, align 16
+
+ %arg_ptr = getelementptr inbounds %pr26154.S, %pr26154.S addrspace(1)* %arg, i16 0, i32 1
+ %arg_bc = bitcast <3 x i8> addrspace(1)* %arg_ptr to i32 addrspace(1)*
+ %arg_val = load i32, i32 addrspace(1)* %arg_bc, align 4
+
+ %a_ptr = getelementptr inbounds %pr26154.S, %pr26154.S* %a, i64 0, i32 1
+ %a_bc = bitcast <3 x i8>* %a_ptr to i32*
+ store i32 %arg_val, i32* %a_bc, align 16
+
+ %amem = bitcast %pr26154.S* %a to i8*
+ %bmem = bitcast %pr26154.S* %b to i8*
+ call void @llvm.memcpy.p0i8.p0i8.i32(i8* %bmem, i8* %amem, i32 20, i32 16, i1 false)
+
+ %b_ptr = getelementptr %pr26154.S, %pr26154.S* %b, i64 0, i32 1
+ %b_val = load <3 x i8>, <3 x i8>* %b_ptr, align 16
+ %x = extractelement <3 x i8> %b_val, i32 0
+ ret i8 %x
+}
Index: lib/Transforms/Scalar/SROA.cpp
===================================================================
--- lib/Transforms/Scalar/SROA.cpp
+++ lib/Transforms/Scalar/SROA.cpp
@@ -3574,7 +3574,9 @@
auto *PartPtrTy = PartTy->getPointerTo(LI->getPointerAddressSpace());
LoadInst *PLoad = IRB.CreateAlignedLoad(
getAdjustedPtr(IRB, DL, BasePtr,
- APInt(DL.getPointerSizeInBits(), PartOffset),
+ APInt(DL.getPointerSizeInBits(
+ PartPtrTy->getPointerAddressSpace()),
+ PartOffset),
PartPtrTy, BasePtr->getName() + "."),
getAdjustedAlignment(LI, PartOffset, DL), /*IsVolatile*/ false,
LI->getName());
@@ -3698,18 +3700,21 @@
int Idx = 0, Size = Offsets.Splits.size();
for (;;) {
auto *PartTy = Type::getIntNTy(Ty->getContext(), PartSize * 8);
- auto *PartPtrTy = PartTy->getPointerTo(SI->getPointerAddressSpace());
+ auto *PartPtrTy = PartTy->getPointerTo();
// Either lookup a split load or create one.
LoadInst *PLoad;
if (SplitLoads) {
PLoad = (*SplitLoads)[Idx];
} else {
IRB.SetInsertPoint(LI);
PLoad = IRB.CreateAlignedLoad(
- getAdjustedPtr(IRB, DL, LoadBasePtr,
- APInt(DL.getPointerSizeInBits(), PartOffset),
- PartPtrTy, LoadBasePtr->getName() + "."),
+ getAdjustedPtr(
+ IRB, DL, LoadBasePtr,
+ APInt(DL.getPointerSizeInBits(LI->getPointerAddressSpace()),
+ PartOffset),
+ PartTy->getPointerTo(LI->getPointerAddressSpace()),
+ LoadBasePtr->getName() + "."),
getAdjustedAlignment(LI, PartOffset, DL), /*IsVolatile*/ false,
LI->getName());
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D32608.97349.patch
Type: text/x-patch
Size: 3278 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170501/8c8a0fb7/attachment.bin>
More information about the llvm-commits
mailing list