Index: llvm/trunk/lib/Transforms/Scalar/SROA.cpp =================================================================== --- llvm/trunk/lib/Transforms/Scalar/SROA.cpp +++ llvm/trunk/lib/Transforms/Scalar/SROA.cpp @@ -3698,7 +3698,8 @@ int Idx = 0, Size = Offsets.Splits.size(); for (;;) { auto *PartTy = Type::getIntNTy(Ty->getContext(), PartSize * 8); - auto *PartPtrTy = PartTy->getPointerTo(SI->getPointerAddressSpace()); + auto *LoadPartPtrTy = PartTy->getPointerTo(LI->getPointerAddressSpace()); + auto *StorePartPtrTy = PartTy->getPointerTo(SI->getPointerAddressSpace()); // Either lookup a split load or create one. LoadInst *PLoad; @@ -3709,7 +3710,7 @@ PLoad = IRB.CreateAlignedLoad( getAdjustedPtr(IRB, DL, LoadBasePtr, APInt(DL.getPointerSizeInBits(), PartOffset), - PartPtrTy, LoadBasePtr->getName() + "."), + LoadPartPtrTy, LoadBasePtr->getName() + "."), getAdjustedAlignment(LI, PartOffset, DL), /*IsVolatile*/ false, LI->getName()); } @@ -3719,7 +3720,7 @@ StoreInst *PStore = IRB.CreateAlignedStore( PLoad, getAdjustedPtr(IRB, DL, StoreBasePtr, APInt(DL.getPointerSizeInBits(), PartOffset), - PartPtrTy, StoreBasePtr->getName() + "."), + StorePartPtrTy, StoreBasePtr->getName() + "."), getAdjustedAlignment(SI, PartOffset, DL), /*IsVolatile*/ false); // Now build a new slice for the alloca. Index: llvm/trunk/test/Transforms/SROA/address-spaces.ll =================================================================== --- llvm/trunk/test/Transforms/SROA/address-spaces.ll +++ llvm/trunk/test/Transforms/SROA/address-spaces.ll @@ -83,3 +83,21 @@ store i32 addrspace(3)* @l, i32 addrspace(3)** %3, align 8 ret void } + +; Make sure pre-splitting doesn't try to introduce an illegal bitcast +define float @presplit(i64 addrspace(1)* %p) { +entry: +; CHECK-LABEL: @presplit( +; CHECK: %[[CAST:.*]] = bitcast i64 addrspace(1)* {{.*}} to i32 addrspace(1)* +; CHECK: load i32, i32 addrspace(1)* %[[CAST]] + %b = alloca i64 + %b.cast = bitcast i64* %b to [2 x float]* + %b.gep1 = getelementptr [2 x float], [2 x float]* %b.cast, i32 0, i32 0 + %b.gep2 = getelementptr [2 x float], [2 x float]* %b.cast, i32 0, i32 1 + %l = load i64, i64 addrspace(1)* %p + store i64 %l, i64* %b + %f1 = load float, float* %b.gep1 + %f2 = load float, float* %b.gep2 + %ret = fadd float %f1, %f2 + ret float %ret +}