blob: 38fd778fba68138b8916f82b4a13771807423903 [file] [log] [blame]
Matt Arsenault1dad3442017-08-07 14:58:04 +00001; RUN: llc -mtriple=amdgcn-- -mcpu=tahiti -mattr=-promote-alloca -amdgpu-sroa=0 -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s
Matt Arsenault07952152016-03-23 21:49:25 +00002
Matt Arsenault45b552b2016-09-17 16:09:55 +00003; GCN-LABEL: {{^}}store_fi_lifetime:
Matt Arsenault199856e2017-02-22 21:05:25 +00004; GCN: v_mov_b32_e32 [[FI:v[0-9]+]], 4{{$}}
Matt Arsenault45b552b2016-09-17 16:09:55 +00005; GCN: buffer_store_dword [[FI]]
Matt Arsenaultc3340e82022-12-01 21:33:26 -05006define amdgpu_kernel void @store_fi_lifetime(ptr addrspace(1) %out, i32 %in) #0 {
Matt Arsenault45b552b2016-09-17 16:09:55 +00007entry:
Yaxun Liu54551102018-02-02 16:07:16 +00008 %b = alloca i8, addrspace(5)
Matt Arsenaultc3340e82022-12-01 21:33:26 -05009 call void @llvm.lifetime.start.p5(i64 1, ptr addrspace(5) %b)
10 store volatile ptr addrspace(5) %b, ptr addrspace(1) undef
11 call void @llvm.lifetime.end.p5(i64 1, ptr addrspace(5) %b)
Matt Arsenault45b552b2016-09-17 16:09:55 +000012 ret void
13}
14
Matt Arsenault07952152016-03-23 21:49:25 +000015; GCN-LABEL: {{^}}stored_fi_to_lds:
Matthias Braun038535e2016-04-29 02:44:54 +000016; GCN: s_load_dword [[LDSPTR:s[0-9]+]]
Matt Arsenault199856e2017-02-22 21:05:25 +000017; GCN: v_mov_b32_e32 [[ZERO0:v[0-9]+]], 4{{$}}
Joe Nashd0f26ed2021-09-08 13:22:15 -040018; GCN: buffer_store_dword v{{[0-9]+}}, off,
Matt Arsenault07952152016-03-23 21:49:25 +000019; GCN: v_mov_b32_e32 [[VLDSPTR:v[0-9]+]], [[LDSPTR]]
Matt Arsenault07952152016-03-23 21:49:25 +000020; GCN: ds_write_b32 [[VLDSPTR]], [[ZERO0]]
Matt Arsenaultc3340e82022-12-01 21:33:26 -050021define amdgpu_kernel void @stored_fi_to_lds(ptr addrspace(3) %ptr) #0 {
Yaxun Liu54551102018-02-02 16:07:16 +000022 %tmp = alloca float, addrspace(5)
Matt Arsenaultc3340e82022-12-01 21:33:26 -050023 store float 4.0, ptr addrspace(5) %tmp
24 store ptr addrspace(5) %tmp, ptr addrspace(3) %ptr
Matt Arsenault07952152016-03-23 21:49:25 +000025 ret void
26}
27
28; Offset is applied
29; GCN-LABEL: {{^}}stored_fi_to_lds_2_small_objects:
Matt Arsenault199856e2017-02-22 21:05:25 +000030; GCN-DAG: v_mov_b32_e32 [[ZERO:v[0-9]+]], 4{{$}}
Scott Lindercd261e12020-01-21 17:27:57 -050031; GCN-DAG: buffer_store_dword v{{[0-9]+}}, off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:4{{$}}
32; GCN-DAG: buffer_store_dword v{{[0-9]+}}, off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:8{{$}}
Matt Arsenaulted1ac8d2016-04-16 02:13:37 +000033
Nicolai Haehnle13e19992016-04-19 21:58:33 +000034; GCN-DAG: s_load_dword [[LDSPTR:s[0-9]+]]
Matt Arsenault07952152016-03-23 21:49:25 +000035
Matt Arsenault07952152016-03-23 21:49:25 +000036; GCN-DAG: v_mov_b32_e32 [[VLDSPTR:v[0-9]+]], [[LDSPTR]]
Matt Arsenaulted1ac8d2016-04-16 02:13:37 +000037; GCN: ds_write_b32 [[VLDSPTR]], [[ZERO]]
Matt Arsenault07952152016-03-23 21:49:25 +000038
Matt Arsenault199856e2017-02-22 21:05:25 +000039; GCN-DAG: v_mov_b32_e32 [[FI1:v[0-9]+]], 8{{$}}
Matt Arsenault07952152016-03-23 21:49:25 +000040; GCN: ds_write_b32 [[VLDSPTR]], [[FI1]]
Matt Arsenaultc3340e82022-12-01 21:33:26 -050041define amdgpu_kernel void @stored_fi_to_lds_2_small_objects(ptr addrspace(3) %ptr) #0 {
Yaxun Liu54551102018-02-02 16:07:16 +000042 %tmp0 = alloca float, addrspace(5)
43 %tmp1 = alloca float, addrspace(5)
Matt Arsenaultc3340e82022-12-01 21:33:26 -050044 store float 4.0, ptr addrspace(5) %tmp0
45 store float 4.0, ptr addrspace(5) %tmp1
46 store volatile ptr addrspace(5) %tmp0, ptr addrspace(3) %ptr
47 store volatile ptr addrspace(5) %tmp1, ptr addrspace(3) %ptr
Matt Arsenault07952152016-03-23 21:49:25 +000048 ret void
49}
50
51; Same frame index is used multiple times in the store
52; GCN-LABEL: {{^}}stored_fi_to_self:
Matt Arsenaulted1ac8d2016-04-16 02:13:37 +000053; GCN-DAG: v_mov_b32_e32 [[K:v[0-9]+]], 0x4d2{{$}}
Scott Lindercd261e12020-01-21 17:27:57 -050054; GCN: buffer_store_dword [[K]], off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:4{{$}}
Matt Arsenault199856e2017-02-22 21:05:25 +000055; GCN-DAG: v_mov_b32_e32 [[ZERO:v[0-9]+]], 4{{$}}
Scott Lindercd261e12020-01-21 17:27:57 -050056; GCN: buffer_store_dword [[ZERO]], off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:4{{$}}
Matt Arsenault4d65dd02017-03-21 21:39:51 +000057define amdgpu_kernel void @stored_fi_to_self() #0 {
Matt Arsenaultc3340e82022-12-01 21:33:26 -050058 %tmp = alloca ptr addrspace(5), addrspace(5)
Matt Arsenault07952152016-03-23 21:49:25 +000059
60 ; Avoid optimizing everything out
Matt Arsenaultc3340e82022-12-01 21:33:26 -050061 store volatile ptr addrspace(5) inttoptr (i32 1234 to ptr addrspace(5)), ptr addrspace(5) %tmp
62 store volatile ptr addrspace(5) %tmp, ptr addrspace(5) %tmp
Matt Arsenault07952152016-03-23 21:49:25 +000063 ret void
64}
65
Matt Arsenaulted1ac8d2016-04-16 02:13:37 +000066; GCN-LABEL: {{^}}stored_fi_to_self_offset:
Matt Arsenaulted1ac8d2016-04-16 02:13:37 +000067; GCN-DAG: v_mov_b32_e32 [[K0:v[0-9]+]], 32{{$}}
Scott Lindercd261e12020-01-21 17:27:57 -050068; GCN: buffer_store_dword [[K0]], off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:4{{$}}
Matt Arsenaulted1ac8d2016-04-16 02:13:37 +000069
70; GCN-DAG: v_mov_b32_e32 [[K1:v[0-9]+]], 0x4d2{{$}}
Scott Lindercd261e12020-01-21 17:27:57 -050071; GCN: buffer_store_dword [[K1]], off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:2052{{$}}
Matt Arsenaulted1ac8d2016-04-16 02:13:37 +000072
Matt Arsenault199856e2017-02-22 21:05:25 +000073; GCN: v_mov_b32_e32 [[OFFSETK:v[0-9]+]], 0x804{{$}}
Scott Lindercd261e12020-01-21 17:27:57 -050074; GCN: buffer_store_dword [[OFFSETK]], off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:2052{{$}}
Matt Arsenault4d65dd02017-03-21 21:39:51 +000075define amdgpu_kernel void @stored_fi_to_self_offset() #0 {
Yaxun Liu54551102018-02-02 16:07:16 +000076 %tmp0 = alloca [512 x i32], addrspace(5)
Matt Arsenaultc3340e82022-12-01 21:33:26 -050077 %tmp1 = alloca ptr addrspace(5), addrspace(5)
Matt Arsenaulted1ac8d2016-04-16 02:13:37 +000078
79 ; Avoid optimizing everything out
Matt Arsenaultc3340e82022-12-01 21:33:26 -050080 store volatile i32 32, ptr addrspace(5) %tmp0
Matt Arsenaulted1ac8d2016-04-16 02:13:37 +000081
Matt Arsenaultc3340e82022-12-01 21:33:26 -050082 store volatile ptr addrspace(5) inttoptr (i32 1234 to ptr addrspace(5)), ptr addrspace(5) %tmp1
Matt Arsenaulted1ac8d2016-04-16 02:13:37 +000083
Matt Arsenaultc3340e82022-12-01 21:33:26 -050084 store volatile ptr addrspace(5) %tmp1, ptr addrspace(5) %tmp1
Matt Arsenaulted1ac8d2016-04-16 02:13:37 +000085 ret void
86}
87
Matt Arsenault07952152016-03-23 21:49:25 +000088; GCN-LABEL: {{^}}stored_fi_to_fi:
Scott Lindercd261e12020-01-21 17:27:57 -050089; GCN: buffer_store_dword v{{[0-9]+}}, off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:4{{$}}
90; GCN: buffer_store_dword v{{[0-9]+}}, off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:8{{$}}
91; GCN: buffer_store_dword v{{[0-9]+}}, off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:12{{$}}
Matt Arsenault07952152016-03-23 21:49:25 +000092
Matt Arsenault199856e2017-02-22 21:05:25 +000093; GCN: v_mov_b32_e32 [[FI1:v[0-9]+]], 8{{$}}
Scott Lindercd261e12020-01-21 17:27:57 -050094; GCN: buffer_store_dword [[FI1]], off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:12{{$}}
Matt Arsenault07952152016-03-23 21:49:25 +000095
Matt Arsenault199856e2017-02-22 21:05:25 +000096; GCN: v_mov_b32_e32 [[FI2:v[0-9]+]], 12{{$}}
Scott Lindercd261e12020-01-21 17:27:57 -050097; GCN: buffer_store_dword [[FI2]], off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:8{{$}}
Matt Arsenault4d65dd02017-03-21 21:39:51 +000098define amdgpu_kernel void @stored_fi_to_fi() #0 {
Matt Arsenaultc3340e82022-12-01 21:33:26 -050099 %tmp0 = alloca ptr addrspace(5), addrspace(5)
100 %tmp1 = alloca ptr addrspace(5), addrspace(5)
101 %tmp2 = alloca ptr addrspace(5), addrspace(5)
102 store volatile ptr addrspace(5) inttoptr (i32 1234 to ptr addrspace(5)), ptr addrspace(5) %tmp0
103 store volatile ptr addrspace(5) inttoptr (i32 5678 to ptr addrspace(5)), ptr addrspace(5) %tmp1
104 store volatile ptr addrspace(5) inttoptr (i32 9999 to ptr addrspace(5)), ptr addrspace(5) %tmp2
Matt Arsenault07952152016-03-23 21:49:25 +0000105
Matt Arsenault07952152016-03-23 21:49:25 +0000106
Matt Arsenaultc3340e82022-12-01 21:33:26 -0500107 store volatile ptr addrspace(5) %tmp1, ptr addrspace(5) %tmp2 ; store offset 4 at offset 8
108 store volatile ptr addrspace(5) %tmp2, ptr addrspace(5) %tmp1 ; store offset 8 at offset 4
Matt Arsenault07952152016-03-23 21:49:25 +0000109 ret void
110}
111
112; GCN-LABEL: {{^}}stored_fi_to_global:
Scott Lindercd261e12020-01-21 17:27:57 -0500113; GCN: buffer_store_dword v{{[0-9]+}}, off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:4{{$}}
Matt Arsenault199856e2017-02-22 21:05:25 +0000114; GCN: v_mov_b32_e32 [[FI:v[0-9]+]], 4{{$}}
Matt Arsenault07952152016-03-23 21:49:25 +0000115; GCN: buffer_store_dword [[FI]]
Matt Arsenaultc3340e82022-12-01 21:33:26 -0500116define amdgpu_kernel void @stored_fi_to_global(ptr addrspace(1) %ptr) #0 {
Yaxun Liu54551102018-02-02 16:07:16 +0000117 %tmp = alloca float, addrspace(5)
Matt Arsenaultc3340e82022-12-01 21:33:26 -0500118 store float 0.0, ptr addrspace(5) %tmp
119 store ptr addrspace(5) %tmp, ptr addrspace(1) %ptr
Matt Arsenault07952152016-03-23 21:49:25 +0000120 ret void
121}
122
123; Offset is applied
124; GCN-LABEL: {{^}}stored_fi_to_global_2_small_objects:
Scott Lindercd261e12020-01-21 17:27:57 -0500125; GCN: buffer_store_dword v{{[0-9]+}}, off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:4{{$}}
126; GCN: buffer_store_dword v{{[0-9]+}}, off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:8{{$}}
127; GCN: buffer_store_dword v{{[0-9]+}}, off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:12{{$}}
Matt Arsenault07952152016-03-23 21:49:25 +0000128
Matt Arsenault199856e2017-02-22 21:05:25 +0000129; GCN: v_mov_b32_e32 [[FI1:v[0-9]+]], 8{{$}}
Nikolay Haustov13d648c2016-04-29 09:02:30 +0000130; GCN: buffer_store_dword [[FI1]], off, s{{\[[0-9]+:[0-9]+\]}}, 0{{$}}
Matt Arsenault07952152016-03-23 21:49:25 +0000131
Matt Arsenault199856e2017-02-22 21:05:25 +0000132; GCN-DAG: v_mov_b32_e32 [[FI2:v[0-9]+]], 12{{$}}
Nikolay Haustov13d648c2016-04-29 09:02:30 +0000133; GCN: buffer_store_dword [[FI2]], off, s{{\[[0-9]+:[0-9]+\]}}, 0{{$}}
Matt Arsenaultc3340e82022-12-01 21:33:26 -0500134define amdgpu_kernel void @stored_fi_to_global_2_small_objects(ptr addrspace(1) %ptr) #0 {
Yaxun Liu54551102018-02-02 16:07:16 +0000135 %tmp0 = alloca float, addrspace(5)
136 %tmp1 = alloca float, addrspace(5)
137 %tmp2 = alloca float, addrspace(5)
Matt Arsenaultc3340e82022-12-01 21:33:26 -0500138 store volatile float 0.0, ptr addrspace(5) %tmp0
139 store volatile float 0.0, ptr addrspace(5) %tmp1
140 store volatile float 0.0, ptr addrspace(5) %tmp2
141 store volatile ptr addrspace(5) %tmp1, ptr addrspace(1) %ptr
142 store volatile ptr addrspace(5) %tmp2, ptr addrspace(1) %ptr
Matt Arsenault07952152016-03-23 21:49:25 +0000143 ret void
144}
145
Matt Arsenaulted1ac8d2016-04-16 02:13:37 +0000146; GCN-LABEL: {{^}}stored_fi_to_global_huge_frame_offset:
Matthias Braunf8eff402016-08-19 03:03:24 +0000147; GCN: v_mov_b32_e32 [[BASE_0:v[0-9]+]], 0{{$}}
Scott Lindercd261e12020-01-21 17:27:57 -0500148; GCN: buffer_store_dword [[BASE_0]], off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:4{{$}}
Matt Arsenaulted1ac8d2016-04-16 02:13:37 +0000149
Matt Arsenault08ac71a2016-10-26 15:08:16 +0000150; FIXME: Re-initialize
Matt Arsenault199856e2017-02-22 21:05:25 +0000151; GCN: v_mov_b32_e32 [[BASE_0_1:v[0-9]+]], 4{{$}}
Matt Arsenault45b552b2016-09-17 16:09:55 +0000152
Matt Arsenault08ac71a2016-10-26 15:08:16 +0000153; GCN-DAG: v_mov_b32_e32 [[K:v[0-9]+]], 0x3e7{{$}}
154; GCN-DAG: v_add_i32_e32 [[BASE_1_OFF_1:v[0-9]+]], vcc, 0x3ffc, [[BASE_0_1]]
Matt Arsenaulted1ac8d2016-04-16 02:13:37 +0000155
Matt Arsenault08ac71a2016-10-26 15:08:16 +0000156
157; GCN: v_add_i32_e32 [[BASE_1_OFF_2:v[0-9]+]], vcc, 56, [[BASE_0_1]]
Scott Lindercd261e12020-01-21 17:27:57 -0500158; GCN: buffer_store_dword [[K]], [[BASE_1_OFF_1]], s{{\[[0-9]+:[0-9]+\]}}, 0 offen{{$}}
Matt Arsenault08ac71a2016-10-26 15:08:16 +0000159
160; GCN: buffer_store_dword [[BASE_1_OFF_2]], off, s{{\[[0-9]+:[0-9]+\]}}, 0{{$}}
Matt Arsenaultc3340e82022-12-01 21:33:26 -0500161define amdgpu_kernel void @stored_fi_to_global_huge_frame_offset(ptr addrspace(1) %ptr) #0 {
Yaxun Liu54551102018-02-02 16:07:16 +0000162 %tmp0 = alloca [4096 x i32], addrspace(5)
163 %tmp1 = alloca [4096 x i32], addrspace(5)
Matt Arsenaultc3340e82022-12-01 21:33:26 -0500164 store volatile i32 0, ptr addrspace(5) %tmp0
165 %gep1.tmp0 = getelementptr [4096 x i32], ptr addrspace(5) %tmp0, i32 0, i32 4095
166 store volatile i32 999, ptr addrspace(5) %gep1.tmp0
167 %gep0.tmp1 = getelementptr [4096 x i32], ptr addrspace(5) %tmp0, i32 0, i32 14
168 store ptr addrspace(5) %gep0.tmp1, ptr addrspace(1) %ptr
Matt Arsenaulted1ac8d2016-04-16 02:13:37 +0000169 ret void
170}
171
Matt Arsenaultc3340e82022-12-01 21:33:26 -0500172@g1 = external addrspace(1) global ptr addrspace(5)
Matt Arsenault45b552b2016-09-17 16:09:55 +0000173
174; This was leaving a dead node around resulting in failing to select
175; on the leftover AssertZext's ValueType operand.
176
177; GCN-LABEL: {{^}}cannot_select_assertzext_valuetype:
Jay Foad4d12a6c2022-01-14 11:03:21 +0000178; GCN: s_getpc_b64 s[[[PC_LO:[0-9]+]]:[[PC_HI:[0-9]+]]]
Konstantin Zhuravlyov5a8a98c2016-10-14 04:37:34 +0000179; GCN: s_add_u32 s{{[0-9]+}}, s[[PC_LO]], g1@gotpcrel32@lo+4
Jay Foadd4431992020-09-01 14:52:01 +0100180; GCN: s_addc_u32 s{{[0-9]+}}, s[[PC_HI]], g1@gotpcrel32@hi+12
Matt Arsenault199856e2017-02-22 21:05:25 +0000181; GCN: v_mov_b32_e32 [[FI:v[0-9]+]], 4{{$}}
Matt Arsenault45b552b2016-09-17 16:09:55 +0000182; GCN: buffer_store_dword [[FI]]
Matt Arsenaultc3340e82022-12-01 21:33:26 -0500183define amdgpu_kernel void @cannot_select_assertzext_valuetype(ptr addrspace(1) %out, i32 %idx) #0 {
Matt Arsenault45b552b2016-09-17 16:09:55 +0000184entry:
Yaxun Liu54551102018-02-02 16:07:16 +0000185 %b = alloca i32, align 4, addrspace(5)
Matt Arsenaultc3340e82022-12-01 21:33:26 -0500186 %tmp1 = load volatile ptr addrspace(5), ptr addrspace(1) @g1, align 4
187 %arrayidx = getelementptr inbounds i32, ptr addrspace(5) %tmp1, i32 %idx
188 %tmp2 = load i32, ptr addrspace(5) %arrayidx, align 4
189 store volatile ptr addrspace(5) %b, ptr addrspace(1) undef
Matt Arsenault45b552b2016-09-17 16:09:55 +0000190 ret void
191}
192
Matt Arsenaultc3340e82022-12-01 21:33:26 -0500193declare void @llvm.lifetime.start.p5(i64, ptr addrspace(5) nocapture) #1
194declare void @llvm.lifetime.end.p5(i64, ptr addrspace(5) nocapture) #1
Matt Arsenault45b552b2016-09-17 16:09:55 +0000195
Matt Arsenault07952152016-03-23 21:49:25 +0000196attributes #0 = { nounwind }
Matt Arsenault45b552b2016-09-17 16:09:55 +0000197attributes #1 = { argmemonly nounwind }