1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -sroa -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:64:64:64-p1:16:16:16-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-n8:16:32:64" 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture readonly, i32, i32, i1) 5*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memcpy.p1i8.p0i8.i32(i8 addrspace(1)* nocapture, i8* nocapture readonly, i32, i32, i1) 6*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memcpy.p0i8.p1i8.i32(i8* nocapture, i8 addrspace(1)* nocapture readonly, i32, i32, i1) 7*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memcpy.p1i8.p1i8.i32(i8 addrspace(1)* nocapture, i8 addrspace(1)* nocapture readonly, i32, i32, i1) 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker; Make sure an illegal bitcast isn't introduced 11*9880d681SAndroid Build Coastguard Workerdefine void @test_address_space_1_1(<2 x i64> addrspace(1)* %a, i16 addrspace(1)* %b) { 12*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_address_space_1_1( 13*9880d681SAndroid Build Coastguard Worker; CHECK: load <2 x i64>, <2 x i64> addrspace(1)* %a, align 2 14*9880d681SAndroid Build Coastguard Worker; CHECK: store <2 x i64> {{.*}}, <2 x i64> addrspace(1)* {{.*}}, align 2 15*9880d681SAndroid Build Coastguard Worker; CHECK: ret void 16*9880d681SAndroid Build Coastguard Worker %aa = alloca <2 x i64>, align 16 17*9880d681SAndroid Build Coastguard Worker %aptr = bitcast <2 x i64> addrspace(1)* %a to i8 addrspace(1)* 18*9880d681SAndroid Build Coastguard Worker %aaptr = bitcast <2 x i64>* %aa to i8* 19*9880d681SAndroid Build Coastguard Worker call void @llvm.memcpy.p0i8.p1i8.i32(i8* %aaptr, i8 addrspace(1)* %aptr, i32 16, i32 2, i1 false) 20*9880d681SAndroid Build Coastguard Worker %bptr = bitcast i16 addrspace(1)* %b to i8 addrspace(1)* 21*9880d681SAndroid Build Coastguard Worker call void @llvm.memcpy.p1i8.p0i8.i32(i8 addrspace(1)* %bptr, i8* %aaptr, i32 16, i32 2, i1 false) 22*9880d681SAndroid Build Coastguard Worker ret void 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerdefine void @test_address_space_1_0(<2 x i64> addrspace(1)* %a, i16* %b) { 26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_address_space_1_0( 27*9880d681SAndroid Build Coastguard Worker; CHECK: load <2 x i64>, <2 x i64> addrspace(1)* %a, align 2 28*9880d681SAndroid Build Coastguard Worker; CHECK: store <2 x i64> {{.*}}, <2 x i64>* {{.*}}, align 2 29*9880d681SAndroid Build Coastguard Worker; CHECK: ret void 30*9880d681SAndroid Build Coastguard Worker %aa = alloca <2 x i64>, align 16 31*9880d681SAndroid Build Coastguard Worker %aptr = bitcast <2 x i64> addrspace(1)* %a to i8 addrspace(1)* 32*9880d681SAndroid Build Coastguard Worker %aaptr = bitcast <2 x i64>* %aa to i8* 33*9880d681SAndroid Build Coastguard Worker call void @llvm.memcpy.p0i8.p1i8.i32(i8* %aaptr, i8 addrspace(1)* %aptr, i32 16, i32 2, i1 false) 34*9880d681SAndroid Build Coastguard Worker %bptr = bitcast i16* %b to i8* 35*9880d681SAndroid Build Coastguard Worker call void @llvm.memcpy.p0i8.p0i8.i32(i8* %bptr, i8* %aaptr, i32 16, i32 2, i1 false) 36*9880d681SAndroid Build Coastguard Worker ret void 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerdefine void @test_address_space_0_1(<2 x i64>* %a, i16 addrspace(1)* %b) { 40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_address_space_0_1( 41*9880d681SAndroid Build Coastguard Worker; CHECK: load <2 x i64>, <2 x i64>* %a, align 2 42*9880d681SAndroid Build Coastguard Worker; CHECK: store <2 x i64> {{.*}}, <2 x i64> addrspace(1)* {{.*}}, align 2 43*9880d681SAndroid Build Coastguard Worker; CHECK: ret void 44*9880d681SAndroid Build Coastguard Worker %aa = alloca <2 x i64>, align 16 45*9880d681SAndroid Build Coastguard Worker %aptr = bitcast <2 x i64>* %a to i8* 46*9880d681SAndroid Build Coastguard Worker %aaptr = bitcast <2 x i64>* %aa to i8* 47*9880d681SAndroid Build Coastguard Worker call void @llvm.memcpy.p0i8.p0i8.i32(i8* %aaptr, i8* %aptr, i32 16, i32 2, i1 false) 48*9880d681SAndroid Build Coastguard Worker %bptr = bitcast i16 addrspace(1)* %b to i8 addrspace(1)* 49*9880d681SAndroid Build Coastguard Worker call void @llvm.memcpy.p1i8.p0i8.i32(i8 addrspace(1)* %bptr, i8* %aaptr, i32 16, i32 2, i1 false) 50*9880d681SAndroid Build Coastguard Worker ret void 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker%struct.struct_test_27.0.13 = type { i32, float, i64, i8, [4 x i32] } 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind 56*9880d681SAndroid Build Coastguard Workerdefine void @copy_struct([5 x i64] %in.coerce) { 57*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @copy_struct( 58*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: memcpy 59*9880d681SAndroid Build Coastguard Workerfor.end: 60*9880d681SAndroid Build Coastguard Worker %in = alloca %struct.struct_test_27.0.13, align 8 61*9880d681SAndroid Build Coastguard Worker %0 = bitcast %struct.struct_test_27.0.13* %in to [5 x i64]* 62*9880d681SAndroid Build Coastguard Worker store [5 x i64] %in.coerce, [5 x i64]* %0, align 8 63*9880d681SAndroid Build Coastguard Worker %scevgep9 = getelementptr %struct.struct_test_27.0.13, %struct.struct_test_27.0.13* %in, i32 0, i32 4, i32 0 64*9880d681SAndroid Build Coastguard Worker %scevgep910 = bitcast i32* %scevgep9 to i8* 65*9880d681SAndroid Build Coastguard Worker call void @llvm.memcpy.p1i8.p0i8.i32(i8 addrspace(1)* undef, i8* %scevgep910, i32 16, i32 4, i1 false) 66*9880d681SAndroid Build Coastguard Worker ret void 67*9880d681SAndroid Build Coastguard Worker} 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker%union.anon = type { i32* } 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker@g = common global i32 0, align 4 72*9880d681SAndroid Build Coastguard Worker@l = common addrspace(3) global i32 0, align 4 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker; Make sure an illegal bitcast isn't introduced 75*9880d681SAndroid Build Coastguard Workerdefine void @pr27557() { 76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @pr27557( 77*9880d681SAndroid Build Coastguard Worker; CHECK: %[[CAST:.*]] = bitcast i32** {{.*}} to i32 addrspace(3)** 78*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 addrspace(3)* @l, i32 addrspace(3)** %[[CAST]] 79*9880d681SAndroid Build Coastguard Worker %1 = alloca %union.anon, align 8 80*9880d681SAndroid Build Coastguard Worker %2 = bitcast %union.anon* %1 to i32** 81*9880d681SAndroid Build Coastguard Worker store i32* @g, i32** %2, align 8 82*9880d681SAndroid Build Coastguard Worker %3 = bitcast %union.anon* %1 to i32 addrspace(3)** 83*9880d681SAndroid Build Coastguard Worker store i32 addrspace(3)* @l, i32 addrspace(3)** %3, align 8 84*9880d681SAndroid Build Coastguard Worker ret void 85*9880d681SAndroid Build Coastguard Worker} 86