Skip to content

Commit 5dfb964

Browse files
authored
[AMDGPU] Prevent VOPD combining of VGPRs with different MSBs (#157168)
1 parent 05aff0e commit 5dfb964

File tree

2 files changed

+277
-0
lines changed

2 files changed

+277
-0
lines changed

llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -934,6 +934,10 @@ std::optional<unsigned> InstInfo::getInvalidCompOperandIndex(
934934
if (!OpXRegs[CompOprIdx] || !OpYRegs[CompOprIdx])
935935
continue;
936936

937+
if (getVGPREncodingMSBs(OpXRegs[CompOprIdx], MRI) !=
938+
getVGPREncodingMSBs(OpYRegs[CompOprIdx], MRI))
939+
return CompOprIdx;
940+
937941
if (SkipSrc && CompOprIdx >= Component::DST_NUM)
938942
continue;
939943

llvm/test/CodeGen/AMDGPU/vopd-combine-gfx1250.mir

Lines changed: 273 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,251 @@ body: |
2727
$vgpr6 = V_MUL_F32_e32 killed $vgpr0, $vgpr0, implicit $mode, implicit $exec
2828
...
2929

30+
---
31+
name: vopd_combine_hi_vgprs
32+
tracksRegLiveness: true
33+
body: |
34+
bb.0:
35+
36+
; SCHED-LABEL: name: vopd_combine_hi_vgprs
37+
; SCHED: $vgpr300 = IMPLICIT_DEF
38+
; SCHED-NEXT: $vgpr301 = IMPLICIT_DEF
39+
; SCHED-NEXT: $vgpr303 = V_SUB_F32_e32 $vgpr301, $vgpr301, implicit $mode, implicit $exec
40+
; SCHED-NEXT: $vgpr306 = V_MUL_F32_e32 $vgpr300, $vgpr300, implicit $mode, implicit $exec
41+
; SCHED-NEXT: $vgpr4 = V_BFM_B32_e32 $vgpr300, $vgpr301, implicit $exec
42+
;
43+
; PAIR-LABEL: name: vopd_combine_hi_vgprs
44+
; PAIR: $vgpr300 = IMPLICIT_DEF
45+
; PAIR-NEXT: $vgpr301 = IMPLICIT_DEF
46+
; PAIR-NEXT: $vgpr303, $vgpr306 = V_DUAL_SUB_F32_e32_X_MUL_F32_e32_gfx1250 $vgpr301, $vgpr301, $vgpr300, $vgpr300, implicit $mode, implicit $exec, implicit $mode, implicit $exec, implicit $mode, implicit $exec
47+
; PAIR-NEXT: $vgpr4 = V_BFM_B32_e32 $vgpr300, $vgpr301, implicit $exec
48+
$vgpr300 = IMPLICIT_DEF
49+
$vgpr301 = IMPLICIT_DEF
50+
$vgpr303 = V_SUB_F32_e32 $vgpr301, $vgpr301, implicit $mode, implicit $exec
51+
$vgpr4 = V_BFM_B32_e32 $vgpr300, $vgpr301, implicit $exec
52+
$vgpr306 = V_MUL_F32_e32 killed $vgpr300, $vgpr300, implicit $mode, implicit $exec
53+
...
54+
55+
---
56+
name: vopd_combine_hi_vgprs_above_512
57+
tracksRegLiveness: true
58+
body: |
59+
bb.0:
60+
61+
; SCHED-LABEL: name: vopd_combine_hi_vgprs_above_512
62+
; SCHED: $vgpr812 = IMPLICIT_DEF
63+
; SCHED-NEXT: $vgpr813 = IMPLICIT_DEF
64+
; SCHED-NEXT: $vgpr559 = V_SUB_F32_e32 $vgpr813, $vgpr813, implicit $mode, implicit $exec
65+
; SCHED-NEXT: $vgpr562 = V_MUL_F32_e32 $vgpr812, $vgpr812, implicit $mode, implicit $exec
66+
; SCHED-NEXT: $vgpr4 = V_BFM_B32_e32 $vgpr812, $vgpr813, implicit $exec
67+
;
68+
; PAIR-LABEL: name: vopd_combine_hi_vgprs_above_512
69+
; PAIR: $vgpr812 = IMPLICIT_DEF
70+
; PAIR-NEXT: $vgpr813 = IMPLICIT_DEF
71+
; PAIR-NEXT: $vgpr559, $vgpr562 = V_DUAL_SUB_F32_e32_X_MUL_F32_e32_gfx1250 $vgpr813, $vgpr813, $vgpr812, $vgpr812, implicit $mode, implicit $exec, implicit $mode, implicit $exec, implicit $mode, implicit $exec
72+
; PAIR-NEXT: $vgpr4 = V_BFM_B32_e32 $vgpr812, $vgpr813, implicit $exec
73+
$vgpr812 = IMPLICIT_DEF
74+
$vgpr813 = IMPLICIT_DEF
75+
$vgpr559 = V_SUB_F32_e32 $vgpr813, $vgpr813, implicit $mode, implicit $exec
76+
$vgpr4 = V_BFM_B32_e32 $vgpr812, $vgpr813, implicit $exec
77+
$vgpr562 = V_MUL_F32_e32 killed $vgpr812, $vgpr812, implicit $mode, implicit $exec
78+
...
79+
80+
---
81+
name: mixed_vgprs_low_and_hi_dst
82+
tracksRegLiveness: true
83+
body: |
84+
bb.0:
85+
86+
; SCHED-LABEL: name: mixed_vgprs_low_and_hi_dst
87+
; SCHED: $vgpr0 = IMPLICIT_DEF
88+
; SCHED-NEXT: $vgpr1 = IMPLICIT_DEF
89+
; SCHED-NEXT: $vgpr303 = V_SUB_F32_e32 $vgpr1, $vgpr1, implicit $mode, implicit $exec
90+
; SCHED-NEXT: $vgpr4 = V_BFM_B32_e32 $vgpr0, killed $vgpr1, implicit $exec
91+
; SCHED-NEXT: $vgpr6 = V_MUL_F32_e32 killed $vgpr0, $vgpr0, implicit $mode, implicit $exec
92+
;
93+
; PAIR-LABEL: name: mixed_vgprs_low_and_hi_dst
94+
; PAIR: $vgpr0 = IMPLICIT_DEF
95+
; PAIR-NEXT: $vgpr1 = IMPLICIT_DEF
96+
; PAIR-NEXT: $vgpr303 = V_SUB_F32_e32 $vgpr1, $vgpr1, implicit $mode, implicit $exec
97+
; PAIR-NEXT: $vgpr4 = V_BFM_B32_e32 $vgpr0, killed $vgpr1, implicit $exec
98+
; PAIR-NEXT: $vgpr6 = V_MUL_F32_e32 killed $vgpr0, $vgpr0, implicit $mode, implicit $exec
99+
$vgpr0 = IMPLICIT_DEF
100+
$vgpr1 = IMPLICIT_DEF
101+
$vgpr303 = V_SUB_F32_e32 $vgpr1, $vgpr1, implicit $mode, implicit $exec
102+
$vgpr4 = V_BFM_B32_e32 $vgpr0, $vgpr1, implicit $exec
103+
$vgpr6 = V_MUL_F32_e32 killed $vgpr0, $vgpr0, implicit $mode, implicit $exec
104+
...
105+
106+
---
107+
name: mixed_vgprs_low_and_hi_scr0
108+
tracksRegLiveness: true
109+
body: |
110+
bb.0:
111+
112+
; SCHED-LABEL: name: mixed_vgprs_low_and_hi_scr0
113+
; SCHED: $vgpr0 = IMPLICIT_DEF
114+
; SCHED-NEXT: $vgpr1 = IMPLICIT_DEF
115+
; SCHED-NEXT: $vgpr300 = IMPLICIT_DEF
116+
; SCHED-NEXT: $vgpr3 = V_SUB_F32_e32 $vgpr1, $vgpr1, implicit $mode, implicit $exec
117+
; SCHED-NEXT: $vgpr4 = V_BFM_B32_e32 $vgpr0, killed $vgpr1, implicit $exec
118+
; SCHED-NEXT: $vgpr6 = V_MUL_F32_e32 $vgpr300, killed $vgpr0, implicit $mode, implicit $exec
119+
;
120+
; PAIR-LABEL: name: mixed_vgprs_low_and_hi_scr0
121+
; PAIR: $vgpr0 = IMPLICIT_DEF
122+
; PAIR-NEXT: $vgpr1 = IMPLICIT_DEF
123+
; PAIR-NEXT: $vgpr300 = IMPLICIT_DEF
124+
; PAIR-NEXT: $vgpr3 = V_SUB_F32_e32 $vgpr1, $vgpr1, implicit $mode, implicit $exec
125+
; PAIR-NEXT: $vgpr4 = V_BFM_B32_e32 $vgpr0, killed $vgpr1, implicit $exec
126+
; PAIR-NEXT: $vgpr6 = V_MUL_F32_e32 $vgpr300, killed $vgpr0, implicit $mode, implicit $exec
127+
$vgpr0 = IMPLICIT_DEF
128+
$vgpr1 = IMPLICIT_DEF
129+
$vgpr300 = IMPLICIT_DEF
130+
$vgpr3 = V_SUB_F32_e32 $vgpr1, $vgpr1, implicit $mode, implicit $exec
131+
$vgpr4 = V_BFM_B32_e32 $vgpr0, $vgpr1, implicit $exec
132+
$vgpr6 = V_MUL_F32_e32 killed $vgpr300, $vgpr0, implicit $mode, implicit $exec
133+
...
134+
135+
---
136+
name: mixed_vgprs_low_and_hi_scr1
137+
tracksRegLiveness: true
138+
body: |
139+
bb.0:
140+
141+
; SCHED-LABEL: name: mixed_vgprs_low_and_hi_scr1
142+
; SCHED: $vgpr0 = IMPLICIT_DEF
143+
; SCHED-NEXT: $vgpr1 = IMPLICIT_DEF
144+
; SCHED-NEXT: $vgpr300 = IMPLICIT_DEF
145+
; SCHED-NEXT: $vgpr3 = V_SUB_F32_e32 $vgpr1, $vgpr301, implicit $mode, implicit $exec
146+
; SCHED-NEXT: $vgpr4 = V_BFM_B32_e32 $vgpr0, killed $vgpr1, implicit $exec
147+
; SCHED-NEXT: $vgpr6 = V_MUL_F32_e32 $vgpr300, killed $vgpr0, implicit $mode, implicit $exec
148+
;
149+
; PAIR-LABEL: name: mixed_vgprs_low_and_hi_scr1
150+
; PAIR: $vgpr0 = IMPLICIT_DEF
151+
; PAIR-NEXT: $vgpr1 = IMPLICIT_DEF
152+
; PAIR-NEXT: $vgpr300 = IMPLICIT_DEF
153+
; PAIR-NEXT: $vgpr3 = V_SUB_F32_e32 $vgpr1, $vgpr301, implicit $mode, implicit $exec
154+
; PAIR-NEXT: $vgpr4 = V_BFM_B32_e32 $vgpr0, killed $vgpr1, implicit $exec
155+
; PAIR-NEXT: $vgpr6 = V_MUL_F32_e32 $vgpr300, killed $vgpr0, implicit $mode, implicit $exec
156+
$vgpr0 = IMPLICIT_DEF
157+
$vgpr1 = IMPLICIT_DEF
158+
$vgpr300 = IMPLICIT_DEF
159+
$vgpr3 = V_SUB_F32_e32 $vgpr1, $vgpr301, implicit $mode, implicit $exec
160+
$vgpr4 = V_BFM_B32_e32 $vgpr0, $vgpr1, implicit $exec
161+
$vgpr6 = V_MUL_F32_e32 killed $vgpr300, $vgpr0, implicit $mode, implicit $exec
162+
...
163+
164+
---
165+
name: mixed_vgprs_hi_and_hi_dst_different_msb
166+
tracksRegLiveness: true
167+
body: |
168+
bb.0:
169+
170+
; SCHED-LABEL: name: mixed_vgprs_hi_and_hi_dst_different_msb
171+
; SCHED: $vgpr0 = IMPLICIT_DEF
172+
; SCHED-NEXT: $vgpr1 = IMPLICIT_DEF
173+
; SCHED-NEXT: $vgpr559 = V_SUB_F32_e32 killed $vgpr1, $vgpr1, implicit $mode, implicit $exec
174+
; SCHED-NEXT: $vgpr303 = V_MUL_F32_e32 killed $vgpr0, $vgpr0, implicit $mode, implicit $exec
175+
;
176+
; PAIR-LABEL: name: mixed_vgprs_hi_and_hi_dst_different_msb
177+
; PAIR: $vgpr0 = IMPLICIT_DEF
178+
; PAIR-NEXT: $vgpr1 = IMPLICIT_DEF
179+
; PAIR-NEXT: $vgpr559 = V_SUB_F32_e32 killed $vgpr1, $vgpr1, implicit $mode, implicit $exec
180+
; PAIR-NEXT: $vgpr303 = V_MUL_F32_e32 killed $vgpr0, $vgpr0, implicit $mode, implicit $exec
181+
$vgpr0 = IMPLICIT_DEF
182+
$vgpr1 = IMPLICIT_DEF
183+
$vgpr559 = V_SUB_F32_e32 $vgpr1, $vgpr1, implicit $mode, implicit $exec
184+
$vgpr303 = V_MUL_F32_e32 killed $vgpr0, $vgpr0, implicit $mode, implicit $exec
185+
...
186+
187+
---
188+
name: mixed_vgprs_low_and_hi_scr0_different_msb
189+
tracksRegLiveness: true
190+
body: |
191+
bb.0:
192+
193+
; SCHED-LABEL: name: mixed_vgprs_low_and_hi_scr0_different_msb
194+
; SCHED: $vgpr0 = IMPLICIT_DEF
195+
; SCHED-NEXT: $vgpr1 = IMPLICIT_DEF
196+
; SCHED-NEXT: $vgpr513 = IMPLICIT_DEF
197+
; SCHED-NEXT: $vgpr812 = IMPLICIT_DEF
198+
; SCHED-NEXT: $vgpr3 = V_SUB_F32_e32 $vgpr513, killed $vgpr1, implicit $mode, implicit $exec
199+
; SCHED-NEXT: $vgpr6 = V_MUL_F32_e32 $vgpr812, killed $vgpr0, implicit $mode, implicit $exec
200+
;
201+
; PAIR-LABEL: name: mixed_vgprs_low_and_hi_scr0_different_msb
202+
; PAIR: $vgpr0 = IMPLICIT_DEF
203+
; PAIR-NEXT: $vgpr1 = IMPLICIT_DEF
204+
; PAIR-NEXT: $vgpr513 = IMPLICIT_DEF
205+
; PAIR-NEXT: $vgpr812 = IMPLICIT_DEF
206+
; PAIR-NEXT: $vgpr3 = V_SUB_F32_e32 $vgpr513, killed $vgpr1, implicit $mode, implicit $exec
207+
; PAIR-NEXT: $vgpr6 = V_MUL_F32_e32 $vgpr812, killed $vgpr0, implicit $mode, implicit $exec
208+
$vgpr0 = IMPLICIT_DEF
209+
$vgpr1 = IMPLICIT_DEF
210+
$vgpr513 = IMPLICIT_DEF
211+
$vgpr812 = IMPLICIT_DEF
212+
$vgpr3 = V_SUB_F32_e32 $vgpr513, $vgpr1, implicit $mode, implicit $exec
213+
$vgpr6 = V_MUL_F32_e32 killed $vgpr812, $vgpr0, implicit $mode, implicit $exec
214+
...
215+
216+
---
217+
name: vopd_combine_sgpr_src0
218+
tracksRegLiveness: true
219+
body: |
220+
bb.0:
221+
222+
; SCHED-LABEL: name: vopd_combine_sgpr_src0
223+
; SCHED: $vgpr0 = IMPLICIT_DEF
224+
; SCHED-NEXT: $vgpr1 = IMPLICIT_DEF
225+
; SCHED-NEXT: $vgpr300 = IMPLICIT_DEF
226+
; SCHED-NEXT: $sgpr0 = IMPLICIT_DEF
227+
; SCHED-NEXT: $vgpr3 = V_SUB_F32_e32 killed $sgpr0, $vgpr1, implicit $mode, implicit $exec
228+
; SCHED-NEXT: $vgpr6 = V_MUL_F32_e32 $vgpr300, $vgpr0, implicit $mode, implicit $exec
229+
; SCHED-NEXT: $vgpr4 = V_BFM_B32_e32 killed $vgpr0, killed $vgpr1, implicit $exec
230+
;
231+
; PAIR-LABEL: name: vopd_combine_sgpr_src0
232+
; PAIR: $vgpr0 = IMPLICIT_DEF
233+
; PAIR-NEXT: $vgpr1 = IMPLICIT_DEF
234+
; PAIR-NEXT: $vgpr300 = IMPLICIT_DEF
235+
; PAIR-NEXT: $sgpr0 = IMPLICIT_DEF
236+
; PAIR-NEXT: $vgpr3, $vgpr6 = V_DUAL_SUB_F32_e32_X_MUL_F32_e32_gfx1250 killed $sgpr0, $vgpr1, $vgpr300, $vgpr0, implicit $mode, implicit $exec, implicit $mode, implicit $exec, implicit $mode, implicit $exec
237+
; PAIR-NEXT: $vgpr4 = V_BFM_B32_e32 killed $vgpr0, killed $vgpr1, implicit $exec
238+
$vgpr0 = IMPLICIT_DEF
239+
$vgpr1 = IMPLICIT_DEF
240+
$vgpr300 = IMPLICIT_DEF
241+
$sgpr0 = IMPLICIT_DEF
242+
$vgpr3 = V_SUB_F32_e32 $sgpr0, $vgpr1, implicit $mode, implicit $exec
243+
$vgpr4 = V_BFM_B32_e32 $vgpr0, $vgpr1, implicit $exec
244+
$vgpr6 = V_MUL_F32_e32 killed $vgpr300, $vgpr0, implicit $mode, implicit $exec
245+
...
246+
247+
---
248+
name: vopd_combine_imm_src0
249+
tracksRegLiveness: true
250+
body: |
251+
bb.0:
252+
253+
; SCHED-LABEL: name: vopd_combine_imm_src0
254+
; SCHED: $vgpr0 = IMPLICIT_DEF
255+
; SCHED-NEXT: $vgpr1 = IMPLICIT_DEF
256+
; SCHED-NEXT: $vgpr300 = IMPLICIT_DEF
257+
; SCHED-NEXT: $vgpr3 = V_SUB_F32_e32 0, $vgpr1, implicit $mode, implicit $exec
258+
; SCHED-NEXT: $vgpr6 = V_MUL_F32_e32 $vgpr300, $vgpr0, implicit $mode, implicit $exec
259+
; SCHED-NEXT: $vgpr4 = V_BFM_B32_e32 killed $vgpr0, killed $vgpr1, implicit $exec
260+
;
261+
; PAIR-LABEL: name: vopd_combine_imm_src0
262+
; PAIR: $vgpr0 = IMPLICIT_DEF
263+
; PAIR-NEXT: $vgpr1 = IMPLICIT_DEF
264+
; PAIR-NEXT: $vgpr300 = IMPLICIT_DEF
265+
; PAIR-NEXT: $vgpr3, $vgpr6 = V_DUAL_SUB_F32_e32_X_MUL_F32_e32_gfx1250 0, $vgpr1, $vgpr300, $vgpr0, implicit $mode, implicit $exec, implicit $mode, implicit $exec, implicit $mode, implicit $exec
266+
; PAIR-NEXT: $vgpr4 = V_BFM_B32_e32 killed $vgpr0, killed $vgpr1, implicit $exec
267+
$vgpr0 = IMPLICIT_DEF
268+
$vgpr1 = IMPLICIT_DEF
269+
$vgpr300 = IMPLICIT_DEF
270+
$vgpr3 = V_SUB_F32_e32 0, $vgpr1, implicit $mode, implicit $exec
271+
$vgpr4 = V_BFM_B32_e32 $vgpr0, $vgpr1, implicit $exec
272+
$vgpr6 = V_MUL_F32_e32 killed $vgpr300, $vgpr0, implicit $mode, implicit $exec
273+
...
274+
30275
---
31276
name: vopd_mov_max_i32
32277
tracksRegLiveness: true
@@ -657,6 +902,34 @@ body: |
657902
$vgpr5 = V_ASHRREV_I32_e32 $vgpr2, $vgpr3, implicit $mode, implicit $exec
658903
...
659904

905+
---
906+
name: vopd_combine_lshr_lshr
907+
tracksRegLiveness: true
908+
body: |
909+
bb.0:
910+
911+
; SCHED-LABEL: name: vopd_combine_lshr_lshr
912+
; SCHED: $vgpr300 = IMPLICIT_DEF
913+
; SCHED-NEXT: $vgpr301 = IMPLICIT_DEF
914+
; SCHED-NEXT: $vgpr302 = IMPLICIT_DEF
915+
; SCHED-NEXT: $vgpr303 = IMPLICIT_DEF
916+
; SCHED-NEXT: $vgpr304 = V_LSHRREV_B32_e32 $vgpr300, $vgpr301, implicit $exec
917+
; SCHED-NEXT: $vgpr305 = V_LSHRREV_B32_e32 $vgpr302, $vgpr303, implicit $mode, implicit $exec
918+
;
919+
; PAIR-LABEL: name: vopd_combine_lshr_lshr
920+
; PAIR: $vgpr300 = IMPLICIT_DEF
921+
; PAIR-NEXT: $vgpr301 = IMPLICIT_DEF
922+
; PAIR-NEXT: $vgpr302 = IMPLICIT_DEF
923+
; PAIR-NEXT: $vgpr303 = IMPLICIT_DEF
924+
; PAIR-NEXT: $vgpr304, $vgpr305 = V_DUAL_LSHRREV_B32_e32_X_LSHRREV_B32_e32_e96_gfx1250 $vgpr300, $vgpr301, $vgpr302, $vgpr303, implicit $exec, implicit $exec, implicit $mode, implicit $exec
925+
$vgpr300 = IMPLICIT_DEF
926+
$vgpr301 = IMPLICIT_DEF
927+
$vgpr302 = IMPLICIT_DEF
928+
$vgpr303 = IMPLICIT_DEF
929+
$vgpr304 = V_LSHRREV_B32_e32 $vgpr300, $vgpr301, implicit $exec
930+
$vgpr305 = V_LSHRREV_B32_e32 $vgpr302, $vgpr303, implicit $mode, implicit $exec
931+
...
932+
660933
---
661934
name: vopd_combine_sub_u32_sub_u32
662935
tracksRegLiveness: true

0 commit comments

Comments
 (0)