xref: /llvm-project/llvm/test/CodeGen/RISCV/rvv/vl-opt.mir (revision 8675cd3facc063673c47ed585bd4b7013119fe1f)
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5
2# RUN: llc %s -o - -mtriple=riscv64 -mattr=+v,+zvfbfmin -run-pass=riscv-vl-optimizer -verify-machineinstrs | FileCheck %s
3
4---
5name: vnsrl_wv_user
6body: |
7  bb.0:
8    liveins: $x1
9    ; CHECK-LABEL: name: vnsrl_wv_user
10    ; CHECK: liveins: $x1
11    ; CHECK-NEXT: {{  $}}
12    ; CHECK-NEXT: %vl:gprnox0 = COPY $x1
13    ; CHECK-NEXT: %x:vr = PseudoVADD_VV_MF4 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */
14    ; CHECK-NEXT: %y:vr = PseudoVNSRL_WV_MF4 $noreg, %x, $noreg, %vl, 4 /* e16 */, 0 /* tu, mu */
15    %vl:gprnox0 = COPY $x1
16    %x:vr = PseudoVADD_VV_MF4 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */
17    %y:vr = PseudoVNSRL_WV_MF4 $noreg, %x, $noreg, %vl, 4 /* e16 */, 0 /* tu, mu */
18...
19---
20name: vredsum_vv_user
21body: |
22  bb.0:
23    liveins: $x1
24    ; CHECK-LABEL: name: vredsum_vv_user
25    ; CHECK: liveins: $x1
26    ; CHECK-NEXT: {{  $}}
27    ; CHECK-NEXT: %vl:gprnox0 = COPY $x1
28    ; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 5 /* e32 */, 0 /* tu, mu */
29    ; CHECK-NEXT: %y:vr = PseudoVREDSUM_VS_M1_E64 $noreg, %x, $noreg, -1, 6 /* e64 */, 0 /* tu, mu */
30    ; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 5 /* e32 */, 0 /* tu, mu */
31    %vl:gprnox0 = COPY $x1
32    %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 5 /* e32 */, 0 /* tu, mu */
33    %y:vr = PseudoVREDSUM_VS_M1_E64 $noreg, %x, $noreg, -1, 6 /* e64 */, 0 /* tu, mu */
34    %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 5 /* e32 */, 0 /* tu, mu */
35...
36---
37name: use_largest_common_vl_imm_imm
38body: |
39  bb.0:
40    ; CHECK-LABEL: name: use_largest_common_vl_imm_imm
41    ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 2, 3 /* e8 */, 0 /* tu, mu */
42    ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
43    ; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 2, 3 /* e8 */, 0 /* tu, mu */
44    %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0
45    %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0
46    %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 2, 3 /* e8 */, 0
47...
48---
49name: use_largest_common_vl_same_reg
50body: |
51  bb.0:
52    liveins: $x1
53    ; CHECK-LABEL: name: use_largest_common_vl_same_reg
54    ; CHECK: liveins: $x1
55    ; CHECK-NEXT: {{  $}}
56    ; CHECK-NEXT: %vl:gprnox0 = COPY $x1
57    ; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, %vl, 3 /* e8 */, 0 /* tu, mu */
58    ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 3 /* e8 */, 0 /* tu, mu */
59    ; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 3 /* e8 */, 0 /* tu, mu */
60    %vl:gprnox0 = COPY $x1
61    %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0
62    %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 3 /* e8 */, 0
63    %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 3 /* e8 */, 0
64...
65---
66name: use_largest_common_vl_diff_regs
67body: |
68  bb.0:
69    liveins: $x1, $x2
70    ; CHECK-LABEL: name: use_largest_common_vl_diff_regs
71    ; CHECK: liveins: $x1, $x2
72    ; CHECK-NEXT: {{  $}}
73    ; CHECK-NEXT: %vl0:gprnox0 = COPY $x1
74    ; CHECK-NEXT: %vl1:gprnox0 = COPY $x2
75    ; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */
76    ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl0, 3 /* e8 */, 0 /* tu, mu */
77    ; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl1, 3 /* e8 */, 0 /* tu, mu */
78    %vl0:gprnox0 = COPY $x1
79    %vl1:gprnox0 = COPY $x2
80    %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0
81    %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl0, 3 /* e8 */, 0
82    %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl1, 3 /* e8 */, 0
83...
84---
85name: use_largest_common_vl_imm_reg
86body: |
87  bb.0:
88    liveins: $x1
89    ; CHECK-LABEL: name: use_largest_common_vl_imm_reg
90    ; CHECK: liveins: $x1
91    ; CHECK-NEXT: {{  $}}
92    ; CHECK-NEXT: %vl:gprnox0 = COPY $x1
93    ; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */
94    ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 3 /* e8 */, 0 /* tu, mu */
95    ; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
96    %vl:gprnox0 = COPY $x1
97    %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0
98    %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 3 /* e8 */, 0
99    %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0
100...
101---
102name: use_largest_common_vl_imm_vlmax
103body: |
104  bb.0:
105    ; CHECK-LABEL: name: use_largest_common_vl_imm_vlmax
106    ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */
107    ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
108    ; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */
109    %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0
110    %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0
111    %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, -1, 3 /* e8 */, 0
112...
113---
114name: vfcvt_x_f_v_nofpexcept
115body: |
116  bb.0:
117    ; CHECK-LABEL: name: vfcvt_x_f_v_nofpexcept
118    ; CHECK: %x:vr = nofpexcept PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, 1, 3 /* e8 */, 0 /* tu, mu */
119    ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
120    %x:vr = nofpexcept PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, -1, 3 /* e32 */, 0
121    %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0
122...
123---
124name: vfcvt_x_f_v_fpexcept
125body: |
126  bb.0:
127    ; CHECK-LABEL: name: vfcvt_x_f_v_fpexcept
128    ; CHECK: %x:vr = PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, -1, 3 /* e8 */, 0 /* tu, mu */
129    ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
130    %x:vr = PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, -1, 3 /* e32 */, 0
131    %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0
132...
133---
134name: vfncvtbf16_f_f_w_nofpexcept
135body: |
136  bb.0:
137    ; CHECK-LABEL: name: vfncvtbf16_f_f_w_nofpexcept
138    ; CHECK: early-clobber %x:vr = nofpexcept PseudoVFNCVTBF16_F_F_W_M1_E16 $noreg, $noreg, 7, 1, 4 /* e16 */, 0 /* tu, mu */, implicit $frm
139    ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */
140    %x:vr = nofpexcept PseudoVFNCVTBF16_F_F_W_M1_E16 $noreg, $noreg, 7, -1, 4 /* e16 */, 0 /* tu, mu */, implicit $frm
141    %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0
142...
143---
144name: vwadd_tied_vs1
145body: |
146  bb.0:
147    ; CHECK-LABEL: name: vwadd_tied_vs1
148    ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
149    ; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_WV_M1_TIED $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */
150    %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */
151    %y:vrm2 = PseudoVWADD_WV_M1_TIED $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */
152...
153---
154name: crossbb
155body: |
156  ; CHECK-LABEL: name: crossbb
157  ; CHECK: bb.0:
158  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
159  ; CHECK-NEXT: {{  $}}
160  ; CHECK-NEXT:   PseudoBR %bb.3
161  ; CHECK-NEXT: {{  $}}
162  ; CHECK-NEXT: bb.1:
163  ; CHECK-NEXT:   %a1:vr = PseudoVADD_VV_M1 $noreg, %c, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
164  ; CHECK-NEXT:   %a2:vr = PseudoVADD_VV_M1 $noreg, %a1, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
165  ; CHECK-NEXT:   PseudoRET
166  ; CHECK-NEXT: {{  $}}
167  ; CHECK-NEXT: bb.2:
168  ; CHECK-NEXT:   %b1:vr = PseudoVADD_VV_M1 $noreg, %c, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
169  ; CHECK-NEXT:   %b2:vr = PseudoVADD_VV_M1 $noreg, %b1, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
170  ; CHECK-NEXT:   PseudoRET
171  ; CHECK-NEXT: {{  $}}
172  ; CHECK-NEXT: bb.3:
173  ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
174  ; CHECK-NEXT:   liveins: $x1
175  ; CHECK-NEXT: {{  $}}
176  ; CHECK-NEXT:   %c:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
177  ; CHECK-NEXT:   BEQ $x1, $x0, %bb.1
178  ; CHECK-NEXT:   PseudoBR %bb.2
179  bb.0:
180    PseudoBR %bb.3
181  bb.1:
182    %a1:vr = PseudoVADD_VV_M1 $noreg, %c, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */
183    %a2:vr = PseudoVADD_VV_M1 $noreg, %a1, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
184    PseudoRET
185  bb.2:
186    %b1:vr = PseudoVADD_VV_M1 $noreg, %c, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */
187    %b2:vr = PseudoVADD_VV_M1 $noreg, %b1, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
188    PseudoRET
189  bb.3:
190    liveins: $x1
191    %c:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */
192    BEQ $x1, $x0, %bb.1
193    PseudoBR %bb.2
194...
195---
196name: unreachable
197body: |
198  ; CHECK-LABEL: name: unreachable
199  ; CHECK: bb.0:
200  ; CHECK-NEXT:   %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
201  ; CHECK-NEXT:   PseudoRET
202  ; CHECK-NEXT: {{  $}}
203  ; CHECK-NEXT: bb.1:
204  ; CHECK-NEXT:   %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
205  ; CHECK-NEXT:   PseudoRET
206  bb.0:
207    %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */
208    PseudoRET
209  bb.1:
210    %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
211    PseudoRET
212