Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / GlobalISel / llvm.amdgcn.image.load.2darraymsaa.ll
blob1c209a697b6378e0da4d525aa8de02077a6469a4
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=tahiti -verify-machineinstrs < %s | FileCheck -check-prefix=GFX6 %s
3 ; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1010 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX10PLUS,GFX10 %s
4 ; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1100 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX10PLUS,GFX11 %s
6 define amdgpu_ps <4 x float> @load_2darraymsaa_v4f32_xyzw(<8 x i32> inreg %rsrc, i32 %s, i32 %t, i32 %slice, i32 %fragid) {
7 ; GFX6-LABEL: load_2darraymsaa_v4f32_xyzw:
8 ; GFX6:       ; %bb.0:
9 ; GFX6-NEXT:    s_mov_b32 s0, s2
10 ; GFX6-NEXT:    s_mov_b32 s1, s3
11 ; GFX6-NEXT:    s_mov_b32 s2, s4
12 ; GFX6-NEXT:    s_mov_b32 s3, s5
13 ; GFX6-NEXT:    s_mov_b32 s4, s6
14 ; GFX6-NEXT:    s_mov_b32 s5, s7
15 ; GFX6-NEXT:    s_mov_b32 s6, s8
16 ; GFX6-NEXT:    s_mov_b32 s7, s9
17 ; GFX6-NEXT:    image_load v[0:3], v[0:3], s[0:7] dmask:0xf unorm da
18 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
19 ; GFX6-NEXT:    ; return to shader part epilog
21 ; GFX10PLUS-LABEL: load_2darraymsaa_v4f32_xyzw:
22 ; GFX10PLUS:       ; %bb.0:
23 ; GFX10PLUS-NEXT:    s_mov_b32 s0, s2
24 ; GFX10PLUS-NEXT:    s_mov_b32 s1, s3
25 ; GFX10PLUS-NEXT:    s_mov_b32 s2, s4
26 ; GFX10PLUS-NEXT:    s_mov_b32 s3, s5
27 ; GFX10PLUS-NEXT:    s_mov_b32 s4, s6
28 ; GFX10PLUS-NEXT:    s_mov_b32 s5, s7
29 ; GFX10PLUS-NEXT:    s_mov_b32 s6, s8
30 ; GFX10PLUS-NEXT:    s_mov_b32 s7, s9
31 ; GFX10PLUS-NEXT:    image_load v[0:3], v[0:3], s[0:7] dmask:0xf dim:SQ_RSRC_IMG_2D_MSAA_ARRAY unorm
32 ; GFX10PLUS-NEXT:    s_waitcnt vmcnt(0)
33 ; GFX10PLUS-NEXT:    ; return to shader part epilog
34   %v = call <4 x float> @llvm.amdgcn.image.load.2darraymsaa.v4f32.i32(i32 15, i32 %s, i32 %t, i32 %slice, i32 %fragid, <8 x i32> %rsrc, i32 0, i32 0)
35   ret <4 x float> %v
38 define amdgpu_ps <4 x float> @load_2darraymsaa_v4f32_xyzw_tfe(<8 x i32> inreg %rsrc, ptr addrspace(1) inreg %out, i32 %s, i32 %t, i32 %slice, i32 %fragid) {
39 ; GFX6-LABEL: load_2darraymsaa_v4f32_xyzw_tfe:
40 ; GFX6:       ; %bb.0:
41 ; GFX6-NEXT:    v_mov_b32_e32 v5, v0
42 ; GFX6-NEXT:    v_mov_b32_e32 v0, 0
43 ; GFX6-NEXT:    s_mov_b32 s0, s2
44 ; GFX6-NEXT:    s_mov_b32 s1, s3
45 ; GFX6-NEXT:    s_mov_b32 s2, s4
46 ; GFX6-NEXT:    s_mov_b32 s3, s5
47 ; GFX6-NEXT:    s_mov_b32 s4, s6
48 ; GFX6-NEXT:    s_mov_b32 s5, s7
49 ; GFX6-NEXT:    s_mov_b32 s6, s8
50 ; GFX6-NEXT:    s_mov_b32 s7, s9
51 ; GFX6-NEXT:    v_mov_b32_e32 v6, v1
52 ; GFX6-NEXT:    v_mov_b32_e32 v7, v2
53 ; GFX6-NEXT:    v_mov_b32_e32 v8, v3
54 ; GFX6-NEXT:    v_mov_b32_e32 v1, v0
55 ; GFX6-NEXT:    v_mov_b32_e32 v2, v0
56 ; GFX6-NEXT:    v_mov_b32_e32 v3, v0
57 ; GFX6-NEXT:    v_mov_b32_e32 v4, v0
58 ; GFX6-NEXT:    image_load v[0:4], v[5:8], s[0:7] dmask:0xf unorm tfe da
59 ; GFX6-NEXT:    s_mov_b32 s8, s10
60 ; GFX6-NEXT:    s_mov_b32 s9, s11
61 ; GFX6-NEXT:    s_mov_b32 s10, -1
62 ; GFX6-NEXT:    s_mov_b32 s11, 0xf000
63 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
64 ; GFX6-NEXT:    buffer_store_dword v4, off, s[8:11], 0
65 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0)
66 ; GFX6-NEXT:    ; return to shader part epilog
68 ; GFX10-LABEL: load_2darraymsaa_v4f32_xyzw_tfe:
69 ; GFX10:       ; %bb.0:
70 ; GFX10-NEXT:    v_mov_b32_e32 v9, 0
71 ; GFX10-NEXT:    v_mov_b32_e32 v5, v0
72 ; GFX10-NEXT:    v_mov_b32_e32 v6, v1
73 ; GFX10-NEXT:    v_mov_b32_e32 v7, v2
74 ; GFX10-NEXT:    v_mov_b32_e32 v8, v3
75 ; GFX10-NEXT:    v_mov_b32_e32 v10, v9
76 ; GFX10-NEXT:    v_mov_b32_e32 v11, v9
77 ; GFX10-NEXT:    v_mov_b32_e32 v12, v9
78 ; GFX10-NEXT:    v_mov_b32_e32 v13, v9
79 ; GFX10-NEXT:    s_mov_b32 s0, s2
80 ; GFX10-NEXT:    s_mov_b32 s1, s3
81 ; GFX10-NEXT:    s_mov_b32 s2, s4
82 ; GFX10-NEXT:    s_mov_b32 s3, s5
83 ; GFX10-NEXT:    s_mov_b32 s4, s6
84 ; GFX10-NEXT:    s_mov_b32 s5, s7
85 ; GFX10-NEXT:    s_mov_b32 s6, s8
86 ; GFX10-NEXT:    s_mov_b32 s7, s9
87 ; GFX10-NEXT:    v_mov_b32_e32 v0, v9
88 ; GFX10-NEXT:    v_mov_b32_e32 v1, v10
89 ; GFX10-NEXT:    v_mov_b32_e32 v2, v11
90 ; GFX10-NEXT:    v_mov_b32_e32 v3, v12
91 ; GFX10-NEXT:    v_mov_b32_e32 v4, v13
92 ; GFX10-NEXT:    image_load v[0:4], v[5:8], s[0:7] dmask:0xf dim:SQ_RSRC_IMG_2D_MSAA_ARRAY unorm tfe
93 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
94 ; GFX10-NEXT:    global_store_dword v9, v4, s[10:11]
95 ; GFX10-NEXT:    ; return to shader part epilog
97 ; GFX11-LABEL: load_2darraymsaa_v4f32_xyzw_tfe:
98 ; GFX11:       ; %bb.0:
99 ; GFX11-NEXT:    v_mov_b32_e32 v9, 0
100 ; GFX11-NEXT:    v_dual_mov_b32 v5, v0 :: v_dual_mov_b32 v6, v1
101 ; GFX11-NEXT:    v_dual_mov_b32 v7, v2 :: v_dual_mov_b32 v8, v3
102 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3)
103 ; GFX11-NEXT:    v_mov_b32_e32 v10, v9
104 ; GFX11-NEXT:    v_mov_b32_e32 v11, v9
105 ; GFX11-NEXT:    v_mov_b32_e32 v12, v9
106 ; GFX11-NEXT:    v_mov_b32_e32 v13, v9
107 ; GFX11-NEXT:    s_mov_b32 s0, s2
108 ; GFX11-NEXT:    s_mov_b32 s1, s3
109 ; GFX11-NEXT:    s_mov_b32 s2, s4
110 ; GFX11-NEXT:    s_mov_b32 s3, s5
111 ; GFX11-NEXT:    s_mov_b32 s4, s6
112 ; GFX11-NEXT:    s_mov_b32 s5, s7
113 ; GFX11-NEXT:    s_mov_b32 s6, s8
114 ; GFX11-NEXT:    s_mov_b32 s7, s9
115 ; GFX11-NEXT:    v_dual_mov_b32 v0, v9 :: v_dual_mov_b32 v1, v10
116 ; GFX11-NEXT:    v_dual_mov_b32 v2, v11 :: v_dual_mov_b32 v3, v12
117 ; GFX11-NEXT:    v_mov_b32_e32 v4, v13
118 ; GFX11-NEXT:    image_load v[0:4], v[5:8], s[0:7] dmask:0xf dim:SQ_RSRC_IMG_2D_MSAA_ARRAY unorm tfe
119 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
120 ; GFX11-NEXT:    global_store_b32 v9, v4, s[10:11]
121 ; GFX11-NEXT:    ; return to shader part epilog
122   %v = call { <4 x float>, i32 } @llvm.amdgcn.image.load.2darraymsaa.sl_v4f32i32s.i32(i32 15, i32 %s, i32 %t, i32 %slice, i32 %fragid, <8 x i32> %rsrc, i32 1, i32 0)
123   %v.vec = extractvalue { <4 x float>, i32 } %v, 0
124   %v.err = extractvalue { <4 x float>, i32 } %v, 1
125   store i32 %v.err, ptr addrspace(1) %out, align 4
126   ret <4 x float> %v.vec
129 define amdgpu_ps <4 x float> @load_2darraymsaa_v4f32_xyzw_tfe_lwe(<8 x i32> inreg %rsrc, ptr addrspace(1) inreg %out, i32 %s, i32 %t, i32 %slice, i32 %fragid) {
130 ; GFX6-LABEL: load_2darraymsaa_v4f32_xyzw_tfe_lwe:
131 ; GFX6:       ; %bb.0:
132 ; GFX6-NEXT:    v_mov_b32_e32 v5, v0
133 ; GFX6-NEXT:    v_mov_b32_e32 v0, 0
134 ; GFX6-NEXT:    s_mov_b32 s0, s2
135 ; GFX6-NEXT:    s_mov_b32 s1, s3
136 ; GFX6-NEXT:    s_mov_b32 s2, s4
137 ; GFX6-NEXT:    s_mov_b32 s3, s5
138 ; GFX6-NEXT:    s_mov_b32 s4, s6
139 ; GFX6-NEXT:    s_mov_b32 s5, s7
140 ; GFX6-NEXT:    s_mov_b32 s6, s8
141 ; GFX6-NEXT:    s_mov_b32 s7, s9
142 ; GFX6-NEXT:    v_mov_b32_e32 v6, v1
143 ; GFX6-NEXT:    v_mov_b32_e32 v7, v2
144 ; GFX6-NEXT:    v_mov_b32_e32 v8, v3
145 ; GFX6-NEXT:    v_mov_b32_e32 v1, v0
146 ; GFX6-NEXT:    v_mov_b32_e32 v2, v0
147 ; GFX6-NEXT:    v_mov_b32_e32 v3, v0
148 ; GFX6-NEXT:    v_mov_b32_e32 v4, v0
149 ; GFX6-NEXT:    image_load v[0:4], v[5:8], s[0:7] dmask:0xf unorm tfe lwe da
150 ; GFX6-NEXT:    s_mov_b32 s8, s10
151 ; GFX6-NEXT:    s_mov_b32 s9, s11
152 ; GFX6-NEXT:    s_mov_b32 s10, -1
153 ; GFX6-NEXT:    s_mov_b32 s11, 0xf000
154 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
155 ; GFX6-NEXT:    buffer_store_dword v4, off, s[8:11], 0
156 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0)
157 ; GFX6-NEXT:    ; return to shader part epilog
159 ; GFX10-LABEL: load_2darraymsaa_v4f32_xyzw_tfe_lwe:
160 ; GFX10:       ; %bb.0:
161 ; GFX10-NEXT:    v_mov_b32_e32 v9, 0
162 ; GFX10-NEXT:    v_mov_b32_e32 v5, v0
163 ; GFX10-NEXT:    v_mov_b32_e32 v6, v1
164 ; GFX10-NEXT:    v_mov_b32_e32 v7, v2
165 ; GFX10-NEXT:    v_mov_b32_e32 v8, v3
166 ; GFX10-NEXT:    v_mov_b32_e32 v10, v9
167 ; GFX10-NEXT:    v_mov_b32_e32 v11, v9
168 ; GFX10-NEXT:    v_mov_b32_e32 v12, v9
169 ; GFX10-NEXT:    v_mov_b32_e32 v13, v9
170 ; GFX10-NEXT:    s_mov_b32 s0, s2
171 ; GFX10-NEXT:    s_mov_b32 s1, s3
172 ; GFX10-NEXT:    s_mov_b32 s2, s4
173 ; GFX10-NEXT:    s_mov_b32 s3, s5
174 ; GFX10-NEXT:    s_mov_b32 s4, s6
175 ; GFX10-NEXT:    s_mov_b32 s5, s7
176 ; GFX10-NEXT:    s_mov_b32 s6, s8
177 ; GFX10-NEXT:    s_mov_b32 s7, s9
178 ; GFX10-NEXT:    v_mov_b32_e32 v0, v9
179 ; GFX10-NEXT:    v_mov_b32_e32 v1, v10
180 ; GFX10-NEXT:    v_mov_b32_e32 v2, v11
181 ; GFX10-NEXT:    v_mov_b32_e32 v3, v12
182 ; GFX10-NEXT:    v_mov_b32_e32 v4, v13
183 ; GFX10-NEXT:    image_load v[0:4], v[5:8], s[0:7] dmask:0xf dim:SQ_RSRC_IMG_2D_MSAA_ARRAY unorm tfe lwe
184 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
185 ; GFX10-NEXT:    global_store_dword v9, v4, s[10:11]
186 ; GFX10-NEXT:    ; return to shader part epilog
188 ; GFX11-LABEL: load_2darraymsaa_v4f32_xyzw_tfe_lwe:
189 ; GFX11:       ; %bb.0:
190 ; GFX11-NEXT:    v_mov_b32_e32 v9, 0
191 ; GFX11-NEXT:    v_dual_mov_b32 v5, v0 :: v_dual_mov_b32 v6, v1
192 ; GFX11-NEXT:    v_dual_mov_b32 v7, v2 :: v_dual_mov_b32 v8, v3
193 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3)
194 ; GFX11-NEXT:    v_mov_b32_e32 v10, v9
195 ; GFX11-NEXT:    v_mov_b32_e32 v11, v9
196 ; GFX11-NEXT:    v_mov_b32_e32 v12, v9
197 ; GFX11-NEXT:    v_mov_b32_e32 v13, v9
198 ; GFX11-NEXT:    s_mov_b32 s0, s2
199 ; GFX11-NEXT:    s_mov_b32 s1, s3
200 ; GFX11-NEXT:    s_mov_b32 s2, s4
201 ; GFX11-NEXT:    s_mov_b32 s3, s5
202 ; GFX11-NEXT:    s_mov_b32 s4, s6
203 ; GFX11-NEXT:    s_mov_b32 s5, s7
204 ; GFX11-NEXT:    s_mov_b32 s6, s8
205 ; GFX11-NEXT:    s_mov_b32 s7, s9
206 ; GFX11-NEXT:    v_dual_mov_b32 v0, v9 :: v_dual_mov_b32 v1, v10
207 ; GFX11-NEXT:    v_dual_mov_b32 v2, v11 :: v_dual_mov_b32 v3, v12
208 ; GFX11-NEXT:    v_mov_b32_e32 v4, v13
209 ; GFX11-NEXT:    image_load v[0:4], v[5:8], s[0:7] dmask:0xf dim:SQ_RSRC_IMG_2D_MSAA_ARRAY unorm tfe lwe
210 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
211 ; GFX11-NEXT:    global_store_b32 v9, v4, s[10:11]
212 ; GFX11-NEXT:    ; return to shader part epilog
213   %v = call { <4 x float>, i32 } @llvm.amdgcn.image.load.2darraymsaa.sl_v4f32i32s.i32(i32 15, i32 %s, i32 %t, i32 %slice, i32 %fragid, <8 x i32> %rsrc, i32 3, i32 0)
214   %v.vec = extractvalue { <4 x float>, i32 } %v, 0
215   %v.err = extractvalue { <4 x float>, i32 } %v, 1
216   store i32 %v.err, ptr addrspace(1) %out, align 4
217   ret <4 x float> %v.vec
220 declare <4 x float> @llvm.amdgcn.image.load.2darraymsaa.v4f32.i32(i32 immarg, i32, i32, i32, i32, <8 x i32>, i32 immarg, i32 immarg) #0
221 declare { <4 x float>, i32 } @llvm.amdgcn.image.load.2darraymsaa.sl_v4f32i32s.i32(i32 immarg, i32, i32, i32, i32, <8 x i32>, i32 immarg, i32 immarg) #0
223 attributes #0 = { nounwind readonly }