mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-10 14:10:58 +00:00
222f9e97f6
Strengthen tests of storing frame indices. Right now this just creates irrelevant scheduling changes. We don't want to have multiple frame index operands on an instruction. There seem to be various assumptions that at least the same frame index will not appear twice in the LocalStackSlotAllocation pass. There's no reason to have this happen, and it just makes it easy to introduce bugs where the immediate offset is appplied to the storing instruction when it should really be applied to the value being stored as a separate add. This might not be sufficient. It might still be problematic to have an add fi, fi situation, but that's even less unlikely to happen in real code. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@264200 91177308-0d34-0410-b5e6-96231b3b80d8
76 lines
2.6 KiB
LLVM
76 lines
2.6 KiB
LLVM
; RUN: llc -march=amdgcn -mattr=+promote-alloca -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s
|
|
; RUN: llc -march=amdgcn -mattr=-promote-alloca -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s
|
|
|
|
; Pointer value is stored in a candidate for LDS usage.
|
|
|
|
; GCN-LABEL: {{^}}stored_lds_pointer_value:
|
|
; GCN: buffer_store_dword v
|
|
define void @stored_lds_pointer_value(float* addrspace(1)* %ptr) #0 {
|
|
%tmp = alloca float
|
|
store float 0.0, float *%tmp
|
|
store float* %tmp, float* addrspace(1)* %ptr
|
|
ret void
|
|
}
|
|
|
|
; GCN-LABEL: {{^}}stored_lds_pointer_value_offset:
|
|
; GCN: buffer_store_dword v
|
|
define void @stored_lds_pointer_value_offset(float* addrspace(1)* %ptr) #0 {
|
|
%tmp0 = alloca float
|
|
%tmp1 = alloca float
|
|
store float 0.0, float *%tmp0
|
|
store float 0.0, float *%tmp1
|
|
store volatile float* %tmp0, float* addrspace(1)* %ptr
|
|
store volatile float* %tmp1, float* addrspace(1)* %ptr
|
|
ret void
|
|
}
|
|
|
|
; GCN-LABEL: {{^}}stored_lds_pointer_value_gep:
|
|
; GCN-DAG: s_mov_b32 s{{[0-9]+}}, SCRATCH_RSRC_DWORD0
|
|
; GCN-DAG: s_mov_b32 s{{[0-9]+}}, SCRATCH_RSRC_DWORD1
|
|
; GCN: buffer_store_dword v
|
|
; GCN: buffer_store_dword v
|
|
define void @stored_lds_pointer_value_gep(float* addrspace(1)* %ptr, i32 %idx) #0 {
|
|
bb:
|
|
%tmp = alloca float, i32 16
|
|
store float 0.0, float* %tmp
|
|
%tmp2 = getelementptr inbounds float, float* %tmp, i32 %idx
|
|
store float* %tmp2, float* addrspace(1)* %ptr
|
|
ret void
|
|
}
|
|
|
|
; Pointer value is stored in a candidate for vector usage
|
|
; GCN-LABEL: {{^}}stored_vector_pointer_value:
|
|
; GCN-DAG: s_mov_b32 s{{[0-9]+}}, SCRATCH_RSRC_DWORD0
|
|
; GCN-DAG: s_mov_b32 s{{[0-9]+}}, SCRATCH_RSRC_DWORD1
|
|
; GCN: buffer_store_dword
|
|
; GCN: buffer_store_dword
|
|
; GCN: buffer_store_dword
|
|
; GCN: buffer_store_dword
|
|
define void @stored_vector_pointer_value(i32* addrspace(1)* %out, i32 %index) {
|
|
entry:
|
|
%tmp0 = alloca [4 x i32]
|
|
%x = getelementptr inbounds [4 x i32], [4 x i32]* %tmp0, i32 0, i32 0
|
|
%y = getelementptr inbounds [4 x i32], [4 x i32]* %tmp0, i32 0, i32 1
|
|
%z = getelementptr inbounds [4 x i32], [4 x i32]* %tmp0, i32 0, i32 2
|
|
%w = getelementptr inbounds [4 x i32], [4 x i32]* %tmp0, i32 0, i32 3
|
|
store i32 0, i32* %x
|
|
store i32 1, i32* %y
|
|
store i32 2, i32* %z
|
|
store i32 3, i32* %w
|
|
%tmp1 = getelementptr inbounds [4 x i32], [4 x i32]* %tmp0, i32 0, i32 %index
|
|
store i32* %tmp1, i32* addrspace(1)* %out
|
|
ret void
|
|
}
|
|
|
|
; GCN-LABEL: {{^}}stored_fi_to_self:
|
|
; GCN-NOT: ds_
|
|
define void @stored_fi_to_self() #0 {
|
|
%tmp = alloca i32*
|
|
store volatile i32* inttoptr (i32 1234 to i32*), i32** %tmp
|
|
%bitcast = bitcast i32** %tmp to i32*
|
|
store volatile i32* %bitcast, i32** %tmp
|
|
ret void
|
|
}
|
|
|
|
attributes #0 = { nounwind }
|