Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / GlobalISel / image-waterfall-loop-O0.ll
blob10cbc56cc5fbea1c611d8420b96307d784c6bece
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -global-isel -O0 -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1031 -verify-machineinstrs -o - %s | FileCheck %s
4 ; Make sure the waterfall loop does not fail the verifier after regalloc fast
6 ; FIXME: There are a lot of extra spills that aren't needed. This is due to the unmerge_merge combine
7 ;        running after RegBankSelect which inserts a lot of COPY instructions, but the original merge
8 ;        instruction (G_BUILD_VECTOR) stays because it has more than one use.
9 ;        Those spills are not present when optimizations are enabled.
10 define <4 x float> @waterfall_loop(<8 x i32> %vgpr_srd) {
11 ; CHECK-LABEL: waterfall_loop:
12 ; CHECK:       ; %bb.0: ; %bb
13 ; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
14 ; CHECK-NEXT:    s_xor_saveexec_b32 s4, -1
15 ; CHECK-NEXT:    buffer_store_dword v0, off, s[0:3], s32 offset:80 ; 4-byte Folded Spill
16 ; CHECK-NEXT:    buffer_store_dword v2, off, s[0:3], s32 offset:84 ; 4-byte Folded Spill
17 ; CHECK-NEXT:    s_mov_b32 exec_lo, s4
18 ; CHECK-NEXT:    ; implicit-def: $vgpr8 : SGPR spill to VGPR lane
19 ; CHECK-NEXT:    v_mov_b32_e32 v8, v0
20 ; CHECK-NEXT:    s_or_saveexec_b32 s21, -1
21 ; CHECK-NEXT:    buffer_load_dword v0, off, s[0:3], s32 ; 4-byte Folded Reload
22 ; CHECK-NEXT:    s_mov_b32 exec_lo, s21
23 ; CHECK-NEXT:    buffer_store_dword v8, off, s[0:3], s32 offset:72 ; 4-byte Folded Spill
24 ; CHECK-NEXT:    v_mov_b32_e32 v15, v1
25 ; CHECK-NEXT:    buffer_load_dword v1, off, s[0:3], s32 offset:72 ; 4-byte Folded Reload
26 ; CHECK-NEXT:    buffer_store_dword v15, off, s[0:3], s32 offset:68 ; 4-byte Folded Spill
27 ; CHECK-NEXT:    v_mov_b32_e32 v14, v2
28 ; CHECK-NEXT:    buffer_store_dword v14, off, s[0:3], s32 offset:64 ; 4-byte Folded Spill
29 ; CHECK-NEXT:    v_mov_b32_e32 v13, v3
30 ; CHECK-NEXT:    buffer_store_dword v13, off, s[0:3], s32 offset:60 ; 4-byte Folded Spill
31 ; CHECK-NEXT:    v_mov_b32_e32 v12, v4
32 ; CHECK-NEXT:    buffer_store_dword v12, off, s[0:3], s32 offset:56 ; 4-byte Folded Spill
33 ; CHECK-NEXT:    v_mov_b32_e32 v11, v5
34 ; CHECK-NEXT:    buffer_store_dword v11, off, s[0:3], s32 offset:52 ; 4-byte Folded Spill
35 ; CHECK-NEXT:    v_mov_b32_e32 v10, v6
36 ; CHECK-NEXT:    buffer_store_dword v10, off, s[0:3], s32 offset:48 ; 4-byte Folded Spill
37 ; CHECK-NEXT:    v_mov_b32_e32 v9, v7
38 ; CHECK-NEXT:    buffer_store_dword v9, off, s[0:3], s32 offset:44 ; 4-byte Folded Spill
39 ; CHECK-NEXT:    ; kill: def $vgpr1 killed $vgpr1 def $vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7_vgpr8 killed $exec
40 ; CHECK-NEXT:    v_mov_b32_e32 v2, v15
41 ; CHECK-NEXT:    v_mov_b32_e32 v3, v14
42 ; CHECK-NEXT:    v_mov_b32_e32 v4, v13
43 ; CHECK-NEXT:    v_mov_b32_e32 v5, v12
44 ; CHECK-NEXT:    v_mov_b32_e32 v6, v11
45 ; CHECK-NEXT:    v_mov_b32_e32 v7, v10
46 ; CHECK-NEXT:    v_mov_b32_e32 v8, v9
47 ; CHECK-NEXT:    s_waitcnt vmcnt(0)
48 ; CHECK-NEXT:    buffer_store_dword v1, off, s[0:3], s32 offset:12 ; 4-byte Folded Spill
49 ; CHECK-NEXT:    buffer_store_dword v2, off, s[0:3], s32 offset:16 ; 4-byte Folded Spill
50 ; CHECK-NEXT:    buffer_store_dword v3, off, s[0:3], s32 offset:20 ; 4-byte Folded Spill
51 ; CHECK-NEXT:    buffer_store_dword v4, off, s[0:3], s32 offset:24 ; 4-byte Folded Spill
52 ; CHECK-NEXT:    buffer_store_dword v5, off, s[0:3], s32 offset:28 ; 4-byte Folded Spill
53 ; CHECK-NEXT:    buffer_store_dword v6, off, s[0:3], s32 offset:32 ; 4-byte Folded Spill
54 ; CHECK-NEXT:    buffer_store_dword v7, off, s[0:3], s32 offset:36 ; 4-byte Folded Spill
55 ; CHECK-NEXT:    buffer_store_dword v8, off, s[0:3], s32 offset:40 ; 4-byte Folded Spill
56 ; CHECK-NEXT:    s_mov_b32 s8, 0
57 ; CHECK-NEXT:    s_mov_b32 s4, s8
58 ; CHECK-NEXT:    s_mov_b32 s5, s8
59 ; CHECK-NEXT:    s_mov_b32 s6, s8
60 ; CHECK-NEXT:    s_mov_b32 s7, s8
61 ; CHECK-NEXT:    v_writelane_b32 v0, s4, 0
62 ; CHECK-NEXT:    v_writelane_b32 v0, s5, 1
63 ; CHECK-NEXT:    v_writelane_b32 v0, s6, 2
64 ; CHECK-NEXT:    v_writelane_b32 v0, s7, 3
65 ; CHECK-NEXT:    s_mov_b32 s6, 0
66 ; CHECK-NEXT:    s_mov_b32 s4, s6
67 ; CHECK-NEXT:    s_mov_b32 s5, s6
68 ; CHECK-NEXT:    v_mov_b32_e32 v1, s4
69 ; CHECK-NEXT:    v_mov_b32_e32 v2, s5
70 ; CHECK-NEXT:    buffer_store_dword v1, off, s[0:3], s32 offset:4 ; 4-byte Folded Spill
71 ; CHECK-NEXT:    buffer_store_dword v2, off, s[0:3], s32 offset:8 ; 4-byte Folded Spill
72 ; CHECK-NEXT:    s_mov_b32 s4, exec_lo
73 ; CHECK-NEXT:    v_writelane_b32 v0, s4, 4
74 ; CHECK-NEXT:    s_or_saveexec_b32 s21, -1
75 ; CHECK-NEXT:    buffer_store_dword v0, off, s[0:3], s32 ; 4-byte Folded Spill
76 ; CHECK-NEXT:    s_mov_b32 exec_lo, s21
77 ; CHECK-NEXT:  .LBB0_1: ; =>This Inner Loop Header: Depth=1
78 ; CHECK-NEXT:    s_or_saveexec_b32 s21, -1
79 ; CHECK-NEXT:    buffer_load_dword v0, off, s[0:3], s32 ; 4-byte Folded Reload
80 ; CHECK-NEXT:    s_mov_b32 exec_lo, s21
81 ; CHECK-NEXT:    buffer_load_dword v9, off, s[0:3], s32 offset:12 ; 4-byte Folded Reload
82 ; CHECK-NEXT:    buffer_load_dword v10, off, s[0:3], s32 offset:16 ; 4-byte Folded Reload
83 ; CHECK-NEXT:    buffer_load_dword v11, off, s[0:3], s32 offset:20 ; 4-byte Folded Reload
84 ; CHECK-NEXT:    buffer_load_dword v12, off, s[0:3], s32 offset:24 ; 4-byte Folded Reload
85 ; CHECK-NEXT:    buffer_load_dword v13, off, s[0:3], s32 offset:28 ; 4-byte Folded Reload
86 ; CHECK-NEXT:    buffer_load_dword v14, off, s[0:3], s32 offset:32 ; 4-byte Folded Reload
87 ; CHECK-NEXT:    buffer_load_dword v15, off, s[0:3], s32 offset:36 ; 4-byte Folded Reload
88 ; CHECK-NEXT:    buffer_load_dword v16, off, s[0:3], s32 offset:40 ; 4-byte Folded Reload
89 ; CHECK-NEXT:    buffer_load_dword v1, off, s[0:3], s32 offset:44 ; 4-byte Folded Reload
90 ; CHECK-NEXT:    buffer_load_dword v2, off, s[0:3], s32 offset:48 ; 4-byte Folded Reload
91 ; CHECK-NEXT:    buffer_load_dword v3, off, s[0:3], s32 offset:52 ; 4-byte Folded Reload
92 ; CHECK-NEXT:    buffer_load_dword v4, off, s[0:3], s32 offset:56 ; 4-byte Folded Reload
93 ; CHECK-NEXT:    buffer_load_dword v5, off, s[0:3], s32 offset:60 ; 4-byte Folded Reload
94 ; CHECK-NEXT:    buffer_load_dword v6, off, s[0:3], s32 offset:64 ; 4-byte Folded Reload
95 ; CHECK-NEXT:    buffer_load_dword v7, off, s[0:3], s32 offset:68 ; 4-byte Folded Reload
96 ; CHECK-NEXT:    buffer_load_dword v8, off, s[0:3], s32 offset:72 ; 4-byte Folded Reload
97 ; CHECK-NEXT:    s_waitcnt vmcnt(0)
98 ; CHECK-NEXT:    v_readfirstlane_b32 s12, v8
99 ; CHECK-NEXT:    v_readfirstlane_b32 s10, v7
100 ; CHECK-NEXT:    v_readfirstlane_b32 s9, v6
101 ; CHECK-NEXT:    v_readfirstlane_b32 s8, v5
102 ; CHECK-NEXT:    v_readfirstlane_b32 s7, v4
103 ; CHECK-NEXT:    v_readfirstlane_b32 s6, v3
104 ; CHECK-NEXT:    v_readfirstlane_b32 s5, v2
105 ; CHECK-NEXT:    v_readfirstlane_b32 s4, v1
106 ; CHECK-NEXT:    ; kill: def $sgpr12 killed $sgpr12 def $sgpr12_sgpr13_sgpr14_sgpr15_sgpr16_sgpr17_sgpr18_sgpr19
107 ; CHECK-NEXT:    s_mov_b32 s13, s10
108 ; CHECK-NEXT:    s_mov_b32 s14, s9
109 ; CHECK-NEXT:    s_mov_b32 s15, s8
110 ; CHECK-NEXT:    s_mov_b32 s16, s7
111 ; CHECK-NEXT:    s_mov_b32 s17, s6
112 ; CHECK-NEXT:    s_mov_b32 s18, s5
113 ; CHECK-NEXT:    s_mov_b32 s19, s4
114 ; CHECK-NEXT:    v_writelane_b32 v0, s12, 5
115 ; CHECK-NEXT:    v_writelane_b32 v0, s13, 6
116 ; CHECK-NEXT:    v_writelane_b32 v0, s14, 7
117 ; CHECK-NEXT:    v_writelane_b32 v0, s15, 8
118 ; CHECK-NEXT:    v_writelane_b32 v0, s16, 9
119 ; CHECK-NEXT:    v_writelane_b32 v0, s17, 10
120 ; CHECK-NEXT:    v_writelane_b32 v0, s18, 11
121 ; CHECK-NEXT:    v_writelane_b32 v0, s19, 12
122 ; CHECK-NEXT:    v_mov_b32_e32 v7, v9
123 ; CHECK-NEXT:    v_mov_b32_e32 v8, v10
124 ; CHECK-NEXT:    v_mov_b32_e32 v5, v11
125 ; CHECK-NEXT:    v_mov_b32_e32 v6, v12
126 ; CHECK-NEXT:    v_mov_b32_e32 v3, v13
127 ; CHECK-NEXT:    v_mov_b32_e32 v4, v14
128 ; CHECK-NEXT:    v_mov_b32_e32 v1, v15
129 ; CHECK-NEXT:    v_mov_b32_e32 v2, v16
130 ; CHECK-NEXT:    s_mov_b64 s[4:5], s[12:13]
131 ; CHECK-NEXT:    s_mov_b64 s[10:11], s[14:15]
132 ; CHECK-NEXT:    s_mov_b64 s[8:9], s[16:17]
133 ; CHECK-NEXT:    s_mov_b64 s[6:7], s[18:19]
134 ; CHECK-NEXT:    v_cmp_eq_u64_e64 s4, s[4:5], v[7:8]
135 ; CHECK-NEXT:    v_cmp_eq_u64_e64 s5, s[10:11], v[5:6]
136 ; CHECK-NEXT:    s_and_b32 s4, s4, s5
137 ; CHECK-NEXT:    v_cmp_eq_u64_e64 s5, s[8:9], v[3:4]
138 ; CHECK-NEXT:    s_and_b32 s4, s4, s5
139 ; CHECK-NEXT:    v_cmp_eq_u64_e64 s5, s[6:7], v[1:2]
140 ; CHECK-NEXT:    s_and_b32 s4, s4, s5
141 ; CHECK-NEXT:    s_and_saveexec_b32 s4, s4
142 ; CHECK-NEXT:    v_writelane_b32 v0, s4, 13
143 ; CHECK-NEXT:    s_or_saveexec_b32 s21, -1
144 ; CHECK-NEXT:    buffer_store_dword v0, off, s[0:3], s32 ; 4-byte Folded Spill
145 ; CHECK-NEXT:    s_mov_b32 exec_lo, s21
146 ; CHECK-NEXT:  ; %bb.2: ; in Loop: Header=BB0_1 Depth=1
147 ; CHECK-NEXT:    s_or_saveexec_b32 s21, -1
148 ; CHECK-NEXT:    buffer_load_dword v2, off, s[0:3], s32 ; 4-byte Folded Reload
149 ; CHECK-NEXT:    s_mov_b32 exec_lo, s21
150 ; CHECK-NEXT:    s_waitcnt vmcnt(0)
151 ; CHECK-NEXT:    v_readlane_b32 s4, v2, 13
152 ; CHECK-NEXT:    v_readlane_b32 s8, v2, 5
153 ; CHECK-NEXT:    v_readlane_b32 s9, v2, 6
154 ; CHECK-NEXT:    v_readlane_b32 s10, v2, 7
155 ; CHECK-NEXT:    v_readlane_b32 s11, v2, 8
156 ; CHECK-NEXT:    v_readlane_b32 s12, v2, 9
157 ; CHECK-NEXT:    v_readlane_b32 s13, v2, 10
158 ; CHECK-NEXT:    v_readlane_b32 s14, v2, 11
159 ; CHECK-NEXT:    v_readlane_b32 s15, v2, 12
160 ; CHECK-NEXT:    v_readlane_b32 s16, v2, 0
161 ; CHECK-NEXT:    v_readlane_b32 s17, v2, 1
162 ; CHECK-NEXT:    v_readlane_b32 s18, v2, 2
163 ; CHECK-NEXT:    v_readlane_b32 s19, v2, 3
164 ; CHECK-NEXT:    buffer_load_dword v0, off, s[0:3], s32 offset:4 ; 4-byte Folded Reload
165 ; CHECK-NEXT:    buffer_load_dword v1, off, s[0:3], s32 offset:8 ; 4-byte Folded Reload
166 ; CHECK-NEXT:    s_waitcnt vmcnt(0)
167 ; CHECK-NEXT:    image_sample v0, v[0:1], s[8:15], s[16:19] dmask:0x1 dim:SQ_RSRC_IMG_2D
168 ; CHECK-NEXT:    s_waitcnt vmcnt(0)
169 ; CHECK-NEXT:    buffer_store_dword v0, off, s[0:3], s32 offset:76 ; 4-byte Folded Spill
170 ; CHECK-NEXT:    s_xor_b32 exec_lo, exec_lo, s4
171 ; CHECK-NEXT:    s_cbranch_execnz .LBB0_1
172 ; CHECK-NEXT:  ; %bb.3:
173 ; CHECK-NEXT:    s_or_saveexec_b32 s21, -1
174 ; CHECK-NEXT:    buffer_load_dword v0, off, s[0:3], s32 ; 4-byte Folded Reload
175 ; CHECK-NEXT:    s_mov_b32 exec_lo, s21
176 ; CHECK-NEXT:    s_waitcnt vmcnt(0)
177 ; CHECK-NEXT:    v_readlane_b32 s4, v0, 4
178 ; CHECK-NEXT:    s_mov_b32 exec_lo, s4
179 ; CHECK-NEXT:  ; %bb.4:
180 ; CHECK-NEXT:    s_or_saveexec_b32 s21, -1
181 ; CHECK-NEXT:    buffer_load_dword v4, off, s[0:3], s32 ; 4-byte Folded Reload
182 ; CHECK-NEXT:    s_mov_b32 exec_lo, s21
183 ; CHECK-NEXT:    buffer_load_dword v0, off, s[0:3], s32 offset:76 ; 4-byte Folded Reload
184 ; CHECK-NEXT:    ; implicit-def: $sgpr4
185 ; CHECK-NEXT:    v_mov_b32_e32 v1, s4
186 ; CHECK-NEXT:    v_mov_b32_e32 v2, s4
187 ; CHECK-NEXT:    v_mov_b32_e32 v3, s4
188 ; CHECK-NEXT:    ; kill: killed $vgpr4
189 ; CHECK-NEXT:    s_xor_saveexec_b32 s4, -1
190 ; CHECK-NEXT:    s_waitcnt vmcnt(0)
191 ; CHECK-NEXT:    buffer_load_dword v0, off, s[0:3], s32 offset:80 ; 4-byte Folded Reload
192 ; CHECK-NEXT:    buffer_load_dword v2, off, s[0:3], s32 offset:84 ; 4-byte Folded Reload
193 ; CHECK-NEXT:    s_mov_b32 exec_lo, s4
194 ; CHECK-NEXT:    s_waitcnt vmcnt(0)
195 ; CHECK-NEXT:    s_setpc_b64 s[30:31]
197   %ret = tail call <4 x float> @llvm.amdgcn.image.sample.2d.v4f32.f32(i32 1, float 0.000000e+00, float 0.000000e+00, <8 x i32> %vgpr_srd, <4 x i32> zeroinitializer, i1 false, i32 0, i32 0)
198   ret <4 x float> %ret
201 declare <4 x float> @llvm.amdgcn.image.sample.2d.v4f32.f32(i32 immarg, float, float, <8 x i32>, <4 x i32>, i1 immarg, i32 immarg, i32 immarg) #0
203 attributes #0 = { nounwind readonly willreturn }