1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=SI -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=GCN -check-prefix=FUNC %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=VI -check-prefix=GCN -check-prefix=FUNC %s 3*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s 4*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=r600 -mcpu=cayman < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker@b = internal addrspace(2) constant [1 x i16] [ i16 7 ], align 2 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker@float_gv = internal unnamed_addr addrspace(2) constant [5 x float] [float 0.0, float 1.0, float 2.0, float 3.0, float 4.0], align 4 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}float: 12*9880d681SAndroid Build Coastguard Worker; GCN: s_load_dword 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker; EG: VTX_READ_32 15*9880d681SAndroid Build Coastguard Worker; EG: @float_gv 16*9880d681SAndroid Build Coastguard Worker; EG-NOT: MOVA_INT 17*9880d681SAndroid Build Coastguard Worker; EG-NOT: MOV 18*9880d681SAndroid Build Coastguard Workerdefine void @float(float addrspace(1)* %out, i32 %index) { 19*9880d681SAndroid Build Coastguard Workerentry: 20*9880d681SAndroid Build Coastguard Worker %0 = getelementptr inbounds [5 x float], [5 x float] addrspace(2)* @float_gv, i32 0, i32 %index 21*9880d681SAndroid Build Coastguard Worker %1 = load float, float addrspace(2)* %0 22*9880d681SAndroid Build Coastguard Worker store float %1, float addrspace(1)* %out 23*9880d681SAndroid Build Coastguard Worker ret void 24*9880d681SAndroid Build Coastguard Worker} 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker@i32_gv = internal unnamed_addr addrspace(2) constant [5 x i32] [i32 0, i32 1, i32 2, i32 3, i32 4], align 4 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}i32: 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker; GCN: s_load_dword 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker; EG: VTX_READ_32 33*9880d681SAndroid Build Coastguard Worker; EG: @i32_gv 34*9880d681SAndroid Build Coastguard Worker; EG-NOT: MOVA_INT 35*9880d681SAndroid Build Coastguard Worker; EG-NOT: MOV 36*9880d681SAndroid Build Coastguard Workerdefine void @i32(i32 addrspace(1)* %out, i32 %index) { 37*9880d681SAndroid Build Coastguard Workerentry: 38*9880d681SAndroid Build Coastguard Worker %0 = getelementptr inbounds [5 x i32], [5 x i32] addrspace(2)* @i32_gv, i32 0, i32 %index 39*9880d681SAndroid Build Coastguard Worker %1 = load i32, i32 addrspace(2)* %0 40*9880d681SAndroid Build Coastguard Worker store i32 %1, i32 addrspace(1)* %out 41*9880d681SAndroid Build Coastguard Worker ret void 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker%struct.foo = type { float, [5 x i32] } 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker@struct_foo_gv = internal unnamed_addr addrspace(2) constant [1 x %struct.foo] [ %struct.foo { float 16.0, [5 x i32] [i32 0, i32 1, i32 2, i32 3, i32 4] } ] 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}struct_foo_gv_load: 50*9880d681SAndroid Build Coastguard Worker; GCN: s_load_dword 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker; EG: VTX_READ_32 53*9880d681SAndroid Build Coastguard Worker; EG: @struct_foo_gv 54*9880d681SAndroid Build Coastguard Worker; EG-NOT: MOVA_INT 55*9880d681SAndroid Build Coastguard Worker; EG-NOT: MOV 56*9880d681SAndroid Build Coastguard Workerdefine void @struct_foo_gv_load(i32 addrspace(1)* %out, i32 %index) { 57*9880d681SAndroid Build Coastguard Worker %gep = getelementptr inbounds [1 x %struct.foo], [1 x %struct.foo] addrspace(2)* @struct_foo_gv, i32 0, i32 0, i32 1, i32 %index 58*9880d681SAndroid Build Coastguard Worker %load = load i32, i32 addrspace(2)* %gep, align 4 59*9880d681SAndroid Build Coastguard Worker store i32 %load, i32 addrspace(1)* %out, align 4 60*9880d681SAndroid Build Coastguard Worker ret void 61*9880d681SAndroid Build Coastguard Worker} 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker@array_v1_gv = internal addrspace(2) constant [4 x <1 x i32>] [ <1 x i32> <i32 1>, 64*9880d681SAndroid Build Coastguard Worker <1 x i32> <i32 2>, 65*9880d681SAndroid Build Coastguard Worker <1 x i32> <i32 3>, 66*9880d681SAndroid Build Coastguard Worker <1 x i32> <i32 4> ] 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}array_v1_gv_load: 69*9880d681SAndroid Build Coastguard Worker; GCN: s_load_dword 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker; EG: VTX_READ_32 72*9880d681SAndroid Build Coastguard Worker; EG: @array_v1_gv 73*9880d681SAndroid Build Coastguard Worker; EG-NOT: MOVA_INT 74*9880d681SAndroid Build Coastguard Worker; EG-NOT: MOV 75*9880d681SAndroid Build Coastguard Workerdefine void @array_v1_gv_load(<1 x i32> addrspace(1)* %out, i32 %index) { 76*9880d681SAndroid Build Coastguard Worker %gep = getelementptr inbounds [4 x <1 x i32>], [4 x <1 x i32>] addrspace(2)* @array_v1_gv, i32 0, i32 %index 77*9880d681SAndroid Build Coastguard Worker %load = load <1 x i32>, <1 x i32> addrspace(2)* %gep, align 4 78*9880d681SAndroid Build Coastguard Worker store <1 x i32> %load, <1 x i32> addrspace(1)* %out, align 4 79*9880d681SAndroid Build Coastguard Worker ret void 80*9880d681SAndroid Build Coastguard Worker} 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}gv_addressing_in_branch: 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker; EG: VTX_READ_32 85*9880d681SAndroid Build Coastguard Worker; EG: @float_gv 86*9880d681SAndroid Build Coastguard Worker; EG-NOT: MOVA_INT 87*9880d681SAndroid Build Coastguard Workerdefine void @gv_addressing_in_branch(float addrspace(1)* %out, i32 %index, i32 %a) { 88*9880d681SAndroid Build Coastguard Workerentry: 89*9880d681SAndroid Build Coastguard Worker %0 = icmp eq i32 0, %a 90*9880d681SAndroid Build Coastguard Worker br i1 %0, label %if, label %else 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Workerif: 93*9880d681SAndroid Build Coastguard Worker %1 = getelementptr inbounds [5 x float], [5 x float] addrspace(2)* @float_gv, i32 0, i32 %index 94*9880d681SAndroid Build Coastguard Worker %2 = load float, float addrspace(2)* %1 95*9880d681SAndroid Build Coastguard Worker store float %2, float addrspace(1)* %out 96*9880d681SAndroid Build Coastguard Worker br label %endif 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Workerelse: 99*9880d681SAndroid Build Coastguard Worker store float 1.0, float addrspace(1)* %out 100*9880d681SAndroid Build Coastguard Worker br label %endif 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Workerendif: 103*9880d681SAndroid Build Coastguard Worker ret void 104*9880d681SAndroid Build Coastguard Worker} 105