diff options
Diffstat (limited to 'llvm/test/CodeGen/R600/32-bit-local-address-space.ll')
| -rw-r--r-- | llvm/test/CodeGen/R600/32-bit-local-address-space.ll | 58 |
1 files changed, 54 insertions, 4 deletions
diff --git a/llvm/test/CodeGen/R600/32-bit-local-address-space.ll b/llvm/test/CodeGen/R600/32-bit-local-address-space.ll index 8c31e01f537..fffaefe0983 100644 --- a/llvm/test/CodeGen/R600/32-bit-local-address-space.ll +++ b/llvm/test/CodeGen/R600/32-bit-local-address-space.ll @@ -11,7 +11,7 @@ ; CHECK-LABEL: @local_address_load ; CHECK: V_MOV_B32_e{{32|64}} [[PTR:v[0-9]]] -; CHECK: DS_READ_B32 [[PTR]] +; CHECK: DS_READ_B32 v{{[0-9]+}}, [[PTR]] define void @local_address_load(i32 addrspace(1)* %out, i32 addrspace(3)* %in) { entry: %0 = load i32 addrspace(3)* %in @@ -32,9 +32,8 @@ entry: } ; CHECK-LABEL: @local_address_gep_const_offset -; CHECK: S_ADD_I32 [[SPTR:s[0-9]]] -; CHECK: V_MOV_B32_e32 [[VPTR:v[0-9]+]], [[SPTR]] -; CHECK: DS_READ_B32 v{{[0-9]+}}, [[VPTR]] +; CHECK: V_MOV_B32_e32 [[VPTR:v[0-9]+]], s{{[0-9]+}} +; CHECK: DS_READ_B32 v{{[0-9]+}}, [[VPTR]], 4, define void @local_address_gep_const_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %in) { entry: %0 = getelementptr i32 addrspace(3)* %in, i32 1 @@ -43,6 +42,19 @@ entry: ret void } +; Offset too large, can't fold into 16-bit immediate offset. +; CHECK-LABEL: @local_address_gep_large_const_offset +; CHECK: S_ADD_I32 [[SPTR:s[0-9]]], s{{[0-9]+}}, 65540 +; CHECK: V_MOV_B32_e32 [[VPTR:v[0-9]+]], [[SPTR]] +; CHECK: DS_READ_B32 [[VPTR]] +define void @local_address_gep_large_const_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %in) { +entry: + %0 = getelementptr i32 addrspace(3)* %in, i32 16385 + %1 = load i32 addrspace(3)* %0 + store i32 %1, i32 addrspace(1)* %out + ret void +} + ; CHECK-LABEL: @null_32bit_lds_ptr: ; CHECK: V_CMP_NE_I32 ; CHECK-NOT: V_CMP_NE_I32 @@ -86,3 +98,41 @@ define void @global_ptr() nounwind { store i32 addrspace(3)* getelementptr ([16384 x i32] addrspace(3)* @dst, i32 0, i32 16), i32 addrspace(3)* addrspace(3)* @ptr ret void } + +; CHECK-LABEL: @local_address_store +; CHECK: DS_WRITE_B32 +define void @local_address_store(i32 addrspace(3)* %out, i32 %val) { + store i32 %val, i32 addrspace(3)* %out + ret void +} + +; CHECK-LABEL: @local_address_gep_store +; CHECK: S_ADD_I32 [[SADDR:s[0-9]+]], +; CHECK: V_MOV_B32_e32 [[ADDR:v[0-9]+]], [[SADDR]] +; CHECK: DS_WRITE_B32 [[ADDR]], v{{[0-9]+}}, +define void @local_address_gep_store(i32 addrspace(3)* %out, i32, i32 %val, i32 %offset) { + %gep = getelementptr i32 addrspace(3)* %out, i32 %offset + store i32 %val, i32 addrspace(3)* %gep, align 4 + ret void +} + +; CHECK-LABEL: @local_address_gep_const_offset_store +; CHECK: V_MOV_B32_e32 [[VPTR:v[0-9]+]], s{{[0-9]+}} +; CHECK: V_MOV_B32_e32 [[VAL:v[0-9]+]], s{{[0-9]+}} +; CHECK: DS_WRITE_B32 [[VPTR]], [[VAL]], 4 +define void @local_address_gep_const_offset_store(i32 addrspace(3)* %out, i32 %val) { + %gep = getelementptr i32 addrspace(3)* %out, i32 1 + store i32 %val, i32 addrspace(3)* %gep, align 4 + ret void +} + +; Offset too large, can't fold into 16-bit immediate offset. +; CHECK-LABEL: @local_address_gep_large_const_offset_store +; CHECK: S_ADD_I32 [[SPTR:s[0-9]]], s{{[0-9]+}}, 65540 +; CHECK: V_MOV_B32_e32 [[VPTR:v[0-9]+]], [[SPTR]] +; CHECK: DS_WRITE_B32 [[VPTR]], v{{[0-9]+}}, 0 +define void @local_address_gep_large_const_offset_store(i32 addrspace(3)* %out, i32 %val) { + %gep = getelementptr i32 addrspace(3)* %out, i32 16385 + store i32 %val, i32 addrspace(3)* %gep, align 4 + ret void +} |

