blob: 268869daaa32189c5f4cc56379bbda836944fc62 [file] [log] [blame]
Tom Stellard78655fc2015-07-16 19:40:09 +00001; RUN: llc -verify-machineinstrs -march=amdgcn -mcpu=SI < %s | FileCheck --check-prefix=GCN --check-prefix=DEFAULT-SCRATCH %s
2; RUN: llc -verify-machineinstrs -march=amdgcn -mcpu=tonga < %s | FileCheck --check-prefix=GCN --check-prefix=DEFAULT-SCRATCH %s
3; RUN: llc -verify-machineinstrs -march=amdgcn -mattr=+huge-scratch-buffer -mcpu=SI < %s | FileCheck --check-prefix=GCN --check-prefix=HUGE-SCRATCH %s
4; RUN: llc -verify-machineinstrs -march=amdgcn -mattr=+huge-scratch-buffer -mcpu=tonga < %s | FileCheck --check-prefix=GCN --check-prefix=HUGE-SCRATCH %s
Tom Stellard80580692015-01-20 17:49:43 +00005
6; When a frame index offset is more than 12-bits, make sure we don't store
7; it in mubuf's offset field.
8
Tom Stellard8255af42015-01-20 17:49:45 +00009; Also, make sure we use the same register for storing the scratch buffer addresss
10; for both stores. This register is allocated by the register scavenger, so we
11; should be able to reuse the same regiser for each scratch buffer access.
12
Tom Stellard78655fc2015-07-16 19:40:09 +000013; GCN-LABEL: {{^}}legal_offset_fi:
14; GCN: v_mov_b32_e32 [[OFFSET:v[0-9]+]], 0{{$}}
15; GCN: buffer_store_dword v{{[0-9]+}}, [[OFFSET]], s[{{[0-9]+}}:{{[0-9]+}}], s{{[0-9]+}} offen
16; GCN: v_mov_b32_e32 [[OFFSET]], 0x8000
17; GCN: buffer_store_dword v{{[0-9]+}}, [[OFFSET]], s[{{[0-9]+}}:{{[0-9]+}}], s{{[0-9]+}} offen{{$}}
Tom Stellard80580692015-01-20 17:49:43 +000018
19define void @legal_offset_fi(i32 addrspace(1)* %out, i32 %cond, i32 %if_offset, i32 %else_offset) {
20entry:
21 %scratch0 = alloca [8192 x i32]
22 %scratch1 = alloca [8192 x i32]
23
David Blaikie79e6c742015-02-27 19:29:02 +000024 %scratchptr0 = getelementptr [8192 x i32], [8192 x i32]* %scratch0, i32 0, i32 0
Tom Stellard80580692015-01-20 17:49:43 +000025 store i32 1, i32* %scratchptr0
26
David Blaikie79e6c742015-02-27 19:29:02 +000027 %scratchptr1 = getelementptr [8192 x i32], [8192 x i32]* %scratch1, i32 0, i32 0
Tom Stellard80580692015-01-20 17:49:43 +000028 store i32 2, i32* %scratchptr1
29
30 %cmp = icmp eq i32 %cond, 0
31 br i1 %cmp, label %if, label %else
32
33if:
David Blaikie79e6c742015-02-27 19:29:02 +000034 %if_ptr = getelementptr [8192 x i32], [8192 x i32]* %scratch0, i32 0, i32 %if_offset
David Blaikiea79ac142015-02-27 21:17:42 +000035 %if_value = load i32, i32* %if_ptr
Tom Stellard80580692015-01-20 17:49:43 +000036 br label %done
37
38else:
David Blaikie79e6c742015-02-27 19:29:02 +000039 %else_ptr = getelementptr [8192 x i32], [8192 x i32]* %scratch1, i32 0, i32 %else_offset
David Blaikiea79ac142015-02-27 21:17:42 +000040 %else_value = load i32, i32* %else_ptr
Tom Stellard80580692015-01-20 17:49:43 +000041 br label %done
42
43done:
44 %value = phi i32 [%if_value, %if], [%else_value, %else]
45 store i32 %value, i32 addrspace(1)* %out
46 ret void
47
48 ret void
49
50}
51
Tom Stellard78655fc2015-07-16 19:40:09 +000052; GCN-LABEL: {{^}}legal_offset_fi_offset
53; GCN: buffer_store_dword v{{[0-9]+}}, v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], s{{[0-9]+}} offen
54; GCN: v_add_i32_e32 [[OFFSET:v[0-9]+]], 0x8000
55; GCN: buffer_store_dword v{{[0-9]+}}, [[OFFSET]], s[{{[0-9]+}}:{{[0-9]+}}], s{{[0-9]+}} offen{{$}}
Tom Stellard80580692015-01-20 17:49:43 +000056
57define void @legal_offset_fi_offset(i32 addrspace(1)* %out, i32 %cond, i32 addrspace(1)* %offsets, i32 %if_offset, i32 %else_offset) {
58entry:
59 %scratch0 = alloca [8192 x i32]
60 %scratch1 = alloca [8192 x i32]
61
David Blaikiea79ac142015-02-27 21:17:42 +000062 %offset0 = load i32, i32 addrspace(1)* %offsets
David Blaikie79e6c742015-02-27 19:29:02 +000063 %scratchptr0 = getelementptr [8192 x i32], [8192 x i32]* %scratch0, i32 0, i32 %offset0
Tom Stellard80580692015-01-20 17:49:43 +000064 store i32 %offset0, i32* %scratchptr0
65
David Blaikie79e6c742015-02-27 19:29:02 +000066 %offsetptr1 = getelementptr i32, i32 addrspace(1)* %offsets, i32 1
David Blaikiea79ac142015-02-27 21:17:42 +000067 %offset1 = load i32, i32 addrspace(1)* %offsetptr1
David Blaikie79e6c742015-02-27 19:29:02 +000068 %scratchptr1 = getelementptr [8192 x i32], [8192 x i32]* %scratch1, i32 0, i32 %offset1
Tom Stellard80580692015-01-20 17:49:43 +000069 store i32 %offset1, i32* %scratchptr1
70
71 %cmp = icmp eq i32 %cond, 0
72 br i1 %cmp, label %if, label %else
73
74if:
David Blaikie79e6c742015-02-27 19:29:02 +000075 %if_ptr = getelementptr [8192 x i32], [8192 x i32]* %scratch0, i32 0, i32 %if_offset
David Blaikiea79ac142015-02-27 21:17:42 +000076 %if_value = load i32, i32* %if_ptr
Tom Stellard80580692015-01-20 17:49:43 +000077 br label %done
78
79else:
David Blaikie79e6c742015-02-27 19:29:02 +000080 %else_ptr = getelementptr [8192 x i32], [8192 x i32]* %scratch1, i32 0, i32 %else_offset
David Blaikiea79ac142015-02-27 21:17:42 +000081 %else_value = load i32, i32* %else_ptr
Tom Stellard80580692015-01-20 17:49:43 +000082 br label %done
83
84done:
85 %value = phi i32 [%if_value, %if], [%else_value, %else]
86 store i32 %value, i32 addrspace(1)* %out
87 ret void
88}
89
Tom Stellard78655fc2015-07-16 19:40:09 +000090; GCN-LABEL: @neg_vaddr_offset
91; We can't prove %offset is positive, so we must do the computation with the
92; immediate in an add instruction instead of folding offset and the immediate into
93; the store instruction.
94; GCN: buffer_store_dword v{{[0-9]+}}, v{{[0-9]+}}, s[{{[0-9]+:[0-9]+}}], s{{[0-9]+}} offen{{$}}
95define void @neg_vaddr_offset(i32 %offset) {
96entry:
97 %array = alloca [8192 x i32]
98 %ptr_offset = add i32 %offset, 4
99 %ptr = getelementptr [8192 x i32], [8192 x i32]* %array, i32 0, i32 %ptr_offset
100 store i32 0, i32* %ptr
101 ret void
102}
103
104; GCN-LABEL: @pos_vaddr_offse
105; DEFAULT-SCRATCH: buffer_store_dword v{{[0-9]+}}, v{{[0-9]+}}, s[{{[0-9]+:[0-9]+}}], s{{[0-9]+}} offen offset:16
106; HUGE-SCRATCH: buffer_store_dword v{{[0-9]+}}, v{{[0-9]+}}, s[{{[0-9]+:[0-9]+}}], s{{[0-9]+}} offen{{$}}
107define void @pos_vaddr_offset(i32 addrspace(1)* %out, i32 %offset) {
108entry:
109 %array = alloca [8192 x i32]
110 %ptr = getelementptr [8192 x i32], [8192 x i32]* %array, i32 0, i32 4
111 store i32 0, i32* %ptr
112 %load_ptr = getelementptr [8192 x i32], [8192 x i32]* %array, i32 0, i32 %offset
113 %val = load i32, i32* %load_ptr
114 store i32 %val, i32 addrspace(1)* %out
115 ret void
116}