xref: /llvm-project/llvm/test/CodeGen/RISCV/rvv/frm-insert.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
1df08350dSYeting Kuo; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2df08350dSYeting Kuo; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs -target-abi=lp64d < %s | FileCheck %s
3df08350dSYeting Kuo; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs -target-abi=lp64d \
4df08350dSYeting Kuo; RUN: -riscv-disable-frm-insert-opt < %s | FileCheck %s --check-prefix=UNOPT
5df08350dSYeting Kuo
6df08350dSYeting Kuodeclare <vscale x 1 x float> @llvm.riscv.vfadd.nxv1f32.nxv1f32(
7df08350dSYeting Kuo  <vscale x 1 x float>,
8df08350dSYeting Kuo  <vscale x 1 x float>,
9df08350dSYeting Kuo  <vscale x 1 x float>,
10df08350dSYeting Kuo  i64, i64)
11df08350dSYeting Kuo
12df08350dSYeting Kuo; Test only save/restore frm once.
13df08350dSYeting Kuodefine <vscale x 1 x float> @test(<vscale x 1 x float> %0, <vscale x 1 x float> %1, i64 %2) nounwind {
14df08350dSYeting Kuo; CHECK-LABEL: test:
15df08350dSYeting Kuo; CHECK:       # %bb.0: # %entry
160ebe48f0SLuke Lau; CHECK-NEXT:    fsrmi a1, 0
17df08350dSYeting Kuo; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
18df08350dSYeting Kuo; CHECK-NEXT:    vfadd.vv v8, v8, v9
19df08350dSYeting Kuo; CHECK-NEXT:    vfadd.vv v8, v8, v8
200ebe48f0SLuke Lau; CHECK-NEXT:    fsrm a1
21df08350dSYeting Kuo; CHECK-NEXT:    ret
22df08350dSYeting Kuo;
23df08350dSYeting Kuo; UNOPT-LABEL: test:
24df08350dSYeting Kuo; UNOPT:       # %bb.0: # %entry
250ebe48f0SLuke Lau; UNOPT-NEXT:    fsrmi a1, 0
26df08350dSYeting Kuo; UNOPT-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
27df08350dSYeting Kuo; UNOPT-NEXT:    vfadd.vv v8, v8, v9
280ebe48f0SLuke Lau; UNOPT-NEXT:    fsrm a1
29df08350dSYeting Kuo; UNOPT-NEXT:    fsrmi a0, 0
30df08350dSYeting Kuo; UNOPT-NEXT:    vfadd.vv v8, v8, v8
31df08350dSYeting Kuo; UNOPT-NEXT:    fsrm a0
32df08350dSYeting Kuo; UNOPT-NEXT:    ret
33df08350dSYeting Kuoentry:
34df08350dSYeting Kuo  %a = call <vscale x 1 x float> @llvm.riscv.vfadd.nxv1f32.nxv1f32(
35df08350dSYeting Kuo    <vscale x 1 x float> undef,
36df08350dSYeting Kuo    <vscale x 1 x float> %0,
37df08350dSYeting Kuo    <vscale x 1 x float> %1,
38df08350dSYeting Kuo    i64 0, i64 %2)
39df08350dSYeting Kuo  %b = call <vscale x 1 x float> @llvm.riscv.vfadd.nxv1f32.nxv1f32(
40df08350dSYeting Kuo    <vscale x 1 x float> undef,
41df08350dSYeting Kuo    <vscale x 1 x float> %a,
42df08350dSYeting Kuo    <vscale x 1 x float> %a,
43df08350dSYeting Kuo    i64 0, i64 %2)
44df08350dSYeting Kuo  ret <vscale x 1 x float> %b
45df08350dSYeting Kuo}
46df08350dSYeting Kuo
47df08350dSYeting Kuo; Test only restore frm once.
48df08350dSYeting Kuodefine <vscale x 1 x float> @test2(<vscale x 1 x float> %0, <vscale x 1 x float> %1, i64 %2) nounwind {
49df08350dSYeting Kuo; CHECK-LABEL: test2:
50df08350dSYeting Kuo; CHECK:       # %bb.0: # %entry
510ebe48f0SLuke Lau; CHECK-NEXT:    fsrmi a1, 0
52df08350dSYeting Kuo; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
53df08350dSYeting Kuo; CHECK-NEXT:    vfadd.vv v8, v8, v9
54df08350dSYeting Kuo; CHECK-NEXT:    fsrmi 1
55df08350dSYeting Kuo; CHECK-NEXT:    vfadd.vv v8, v8, v8
560ebe48f0SLuke Lau; CHECK-NEXT:    fsrm a1
57df08350dSYeting Kuo; CHECK-NEXT:    ret
58df08350dSYeting Kuo;
59df08350dSYeting Kuo; UNOPT-LABEL: test2:
60df08350dSYeting Kuo; UNOPT:       # %bb.0: # %entry
610ebe48f0SLuke Lau; UNOPT-NEXT:    fsrmi a1, 0
62df08350dSYeting Kuo; UNOPT-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
63df08350dSYeting Kuo; UNOPT-NEXT:    vfadd.vv v8, v8, v9
640ebe48f0SLuke Lau; UNOPT-NEXT:    fsrm a1
65df08350dSYeting Kuo; UNOPT-NEXT:    fsrmi a0, 1
66df08350dSYeting Kuo; UNOPT-NEXT:    vfadd.vv v8, v8, v8
67df08350dSYeting Kuo; UNOPT-NEXT:    fsrm a0
68df08350dSYeting Kuo; UNOPT-NEXT:    ret
69df08350dSYeting Kuoentry:
70df08350dSYeting Kuo  %a = call <vscale x 1 x float> @llvm.riscv.vfadd.nxv1f32.nxv1f32(
71df08350dSYeting Kuo    <vscale x 1 x float> undef,
72df08350dSYeting Kuo    <vscale x 1 x float> %0,
73df08350dSYeting Kuo    <vscale x 1 x float> %1,
74df08350dSYeting Kuo    i64 0, i64 %2)
75df08350dSYeting Kuo  %b = call <vscale x 1 x float> @llvm.riscv.vfadd.nxv1f32.nxv1f32(
76df08350dSYeting Kuo    <vscale x 1 x float> undef,
77df08350dSYeting Kuo    <vscale x 1 x float> %a,
78df08350dSYeting Kuo    <vscale x 1 x float> %a,
79df08350dSYeting Kuo    i64 1, i64 %2)
80df08350dSYeting Kuo  ret <vscale x 1 x float> %b
81df08350dSYeting Kuo}
82df08350dSYeting Kuo
83df08350dSYeting Kuodeclare void @foo()
84df08350dSYeting Kuodefine <vscale x 1 x float> @just_call(<vscale x 1 x float> %0) nounwind {
85df08350dSYeting Kuo; CHECK-LABEL: just_call:
86df08350dSYeting Kuo; CHECK:       # %bb.0: # %entry
87df08350dSYeting Kuo; CHECK-NEXT:    addi sp, sp, -48
88df08350dSYeting Kuo; CHECK-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
89df08350dSYeting Kuo; CHECK-NEXT:    csrr a0, vlenb
90df08350dSYeting Kuo; CHECK-NEXT:    sub sp, sp, a0
91df08350dSYeting Kuo; CHECK-NEXT:    addi a0, sp, 32
92df08350dSYeting Kuo; CHECK-NEXT:    vs1r.v v8, (a0) # Unknown-size Folded Spill
93df08350dSYeting Kuo; CHECK-NEXT:    call foo
94df08350dSYeting Kuo; CHECK-NEXT:    addi a0, sp, 32
95df08350dSYeting Kuo; CHECK-NEXT:    vl1r.v v8, (a0) # Unknown-size Folded Reload
96df08350dSYeting Kuo; CHECK-NEXT:    csrr a0, vlenb
97df08350dSYeting Kuo; CHECK-NEXT:    add sp, sp, a0
98df08350dSYeting Kuo; CHECK-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
99df08350dSYeting Kuo; CHECK-NEXT:    addi sp, sp, 48
100df08350dSYeting Kuo; CHECK-NEXT:    ret
101df08350dSYeting Kuo;
102df08350dSYeting Kuo; UNOPT-LABEL: just_call:
103df08350dSYeting Kuo; UNOPT:       # %bb.0: # %entry
104df08350dSYeting Kuo; UNOPT-NEXT:    addi sp, sp, -48
105df08350dSYeting Kuo; UNOPT-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
106df08350dSYeting Kuo; UNOPT-NEXT:    csrr a0, vlenb
107df08350dSYeting Kuo; UNOPT-NEXT:    sub sp, sp, a0
108df08350dSYeting Kuo; UNOPT-NEXT:    addi a0, sp, 32
109df08350dSYeting Kuo; UNOPT-NEXT:    vs1r.v v8, (a0) # Unknown-size Folded Spill
110df08350dSYeting Kuo; UNOPT-NEXT:    call foo
111df08350dSYeting Kuo; UNOPT-NEXT:    addi a0, sp, 32
112df08350dSYeting Kuo; UNOPT-NEXT:    vl1r.v v8, (a0) # Unknown-size Folded Reload
113df08350dSYeting Kuo; UNOPT-NEXT:    csrr a0, vlenb
114df08350dSYeting Kuo; UNOPT-NEXT:    add sp, sp, a0
115df08350dSYeting Kuo; UNOPT-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
116df08350dSYeting Kuo; UNOPT-NEXT:    addi sp, sp, 48
117df08350dSYeting Kuo; UNOPT-NEXT:    ret
118df08350dSYeting Kuoentry:
119df08350dSYeting Kuo  call void @foo()
120df08350dSYeting Kuo  ret <vscale x 1 x float> %0
121df08350dSYeting Kuo}
122df08350dSYeting Kuo
123df08350dSYeting Kuodefine <vscale x 1 x float> @before_call1(<vscale x 1 x float> %0, <vscale x 1 x float> %1, i64 %2) nounwind {
124df08350dSYeting Kuo; CHECK-LABEL: before_call1:
125df08350dSYeting Kuo; CHECK:       # %bb.0: # %entry
126df08350dSYeting Kuo; CHECK-NEXT:    addi sp, sp, -48
127df08350dSYeting Kuo; CHECK-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
128df08350dSYeting Kuo; CHECK-NEXT:    csrr a1, vlenb
129df08350dSYeting Kuo; CHECK-NEXT:    sub sp, sp, a1
1300ebe48f0SLuke Lau; CHECK-NEXT:    fsrmi a1, 0
131df08350dSYeting Kuo; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
132df08350dSYeting Kuo; CHECK-NEXT:    vfadd.vv v8, v8, v9
1330ebe48f0SLuke Lau; CHECK-NEXT:    addi a0, sp, 32
1340ebe48f0SLuke Lau; CHECK-NEXT:    vs1r.v v8, (a0) # Unknown-size Folded Spill
1350ebe48f0SLuke Lau; CHECK-NEXT:    fsrm a1
136df08350dSYeting Kuo; CHECK-NEXT:    call foo
137df08350dSYeting Kuo; CHECK-NEXT:    addi a0, sp, 32
138df08350dSYeting Kuo; CHECK-NEXT:    vl1r.v v8, (a0) # Unknown-size Folded Reload
139df08350dSYeting Kuo; CHECK-NEXT:    csrr a0, vlenb
140df08350dSYeting Kuo; CHECK-NEXT:    add sp, sp, a0
141df08350dSYeting Kuo; CHECK-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
142df08350dSYeting Kuo; CHECK-NEXT:    addi sp, sp, 48
143df08350dSYeting Kuo; CHECK-NEXT:    ret
144df08350dSYeting Kuo;
145df08350dSYeting Kuo; UNOPT-LABEL: before_call1:
146df08350dSYeting Kuo; UNOPT:       # %bb.0: # %entry
147df08350dSYeting Kuo; UNOPT-NEXT:    addi sp, sp, -48
148df08350dSYeting Kuo; UNOPT-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
149df08350dSYeting Kuo; UNOPT-NEXT:    csrr a1, vlenb
150df08350dSYeting Kuo; UNOPT-NEXT:    sub sp, sp, a1
1510ebe48f0SLuke Lau; UNOPT-NEXT:    fsrmi a1, 0
152df08350dSYeting Kuo; UNOPT-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
153df08350dSYeting Kuo; UNOPT-NEXT:    vfadd.vv v8, v8, v9
1540ebe48f0SLuke Lau; UNOPT-NEXT:    addi a0, sp, 32
1550ebe48f0SLuke Lau; UNOPT-NEXT:    vs1r.v v8, (a0) # Unknown-size Folded Spill
1560ebe48f0SLuke Lau; UNOPT-NEXT:    fsrm a1
157df08350dSYeting Kuo; UNOPT-NEXT:    call foo
158df08350dSYeting Kuo; UNOPT-NEXT:    addi a0, sp, 32
159df08350dSYeting Kuo; UNOPT-NEXT:    vl1r.v v8, (a0) # Unknown-size Folded Reload
160df08350dSYeting Kuo; UNOPT-NEXT:    csrr a0, vlenb
161df08350dSYeting Kuo; UNOPT-NEXT:    add sp, sp, a0
162df08350dSYeting Kuo; UNOPT-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
163df08350dSYeting Kuo; UNOPT-NEXT:    addi sp, sp, 48
164df08350dSYeting Kuo; UNOPT-NEXT:    ret
165df08350dSYeting Kuoentry:
166df08350dSYeting Kuo  %a = call <vscale x 1 x float> @llvm.riscv.vfadd.nxv1f32.nxv1f32(
167df08350dSYeting Kuo    <vscale x 1 x float> undef,
168df08350dSYeting Kuo    <vscale x 1 x float> %0,
169df08350dSYeting Kuo    <vscale x 1 x float> %1,
170df08350dSYeting Kuo    i64 0, i64 %2)
171df08350dSYeting Kuo  call void @foo()
172df08350dSYeting Kuo  ret <vscale x 1 x float> %a
173df08350dSYeting Kuo}
174df08350dSYeting Kuo
175df08350dSYeting Kuodefine <vscale x 1 x float> @before_call2(<vscale x 1 x float> %0, <vscale x 1 x float> %1, i64 %2) nounwind {
176df08350dSYeting Kuo; CHECK-LABEL: before_call2:
177df08350dSYeting Kuo; CHECK:       # %bb.0: # %entry
178df08350dSYeting Kuo; CHECK-NEXT:    addi sp, sp, -48
179df08350dSYeting Kuo; CHECK-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
180df08350dSYeting Kuo; CHECK-NEXT:    csrr a1, vlenb
181df08350dSYeting Kuo; CHECK-NEXT:    sub sp, sp, a1
182df08350dSYeting Kuo; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
183df08350dSYeting Kuo; CHECK-NEXT:    vfadd.vv v8, v8, v9
184df08350dSYeting Kuo; CHECK-NEXT:    addi a0, sp, 32
185df08350dSYeting Kuo; CHECK-NEXT:    vs1r.v v8, (a0) # Unknown-size Folded Spill
186df08350dSYeting Kuo; CHECK-NEXT:    call foo
187df08350dSYeting Kuo; CHECK-NEXT:    addi a0, sp, 32
188df08350dSYeting Kuo; CHECK-NEXT:    vl1r.v v8, (a0) # Unknown-size Folded Reload
189df08350dSYeting Kuo; CHECK-NEXT:    csrr a0, vlenb
190df08350dSYeting Kuo; CHECK-NEXT:    add sp, sp, a0
191df08350dSYeting Kuo; CHECK-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
192df08350dSYeting Kuo; CHECK-NEXT:    addi sp, sp, 48
193df08350dSYeting Kuo; CHECK-NEXT:    ret
194df08350dSYeting Kuo;
195df08350dSYeting Kuo; UNOPT-LABEL: before_call2:
196df08350dSYeting Kuo; UNOPT:       # %bb.0: # %entry
197df08350dSYeting Kuo; UNOPT-NEXT:    addi sp, sp, -48
198df08350dSYeting Kuo; UNOPT-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
199df08350dSYeting Kuo; UNOPT-NEXT:    csrr a1, vlenb
200df08350dSYeting Kuo; UNOPT-NEXT:    sub sp, sp, a1
201df08350dSYeting Kuo; UNOPT-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
202df08350dSYeting Kuo; UNOPT-NEXT:    vfadd.vv v8, v8, v9
203df08350dSYeting Kuo; UNOPT-NEXT:    addi a0, sp, 32
204df08350dSYeting Kuo; UNOPT-NEXT:    vs1r.v v8, (a0) # Unknown-size Folded Spill
205df08350dSYeting Kuo; UNOPT-NEXT:    call foo
206df08350dSYeting Kuo; UNOPT-NEXT:    addi a0, sp, 32
207df08350dSYeting Kuo; UNOPT-NEXT:    vl1r.v v8, (a0) # Unknown-size Folded Reload
208df08350dSYeting Kuo; UNOPT-NEXT:    csrr a0, vlenb
209df08350dSYeting Kuo; UNOPT-NEXT:    add sp, sp, a0
210df08350dSYeting Kuo; UNOPT-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
211df08350dSYeting Kuo; UNOPT-NEXT:    addi sp, sp, 48
212df08350dSYeting Kuo; UNOPT-NEXT:    ret
213df08350dSYeting Kuoentry:
214df08350dSYeting Kuo  %a = call <vscale x 1 x float> @llvm.riscv.vfadd.nxv1f32.nxv1f32(
215df08350dSYeting Kuo    <vscale x 1 x float> undef,
216df08350dSYeting Kuo    <vscale x 1 x float> %0,
217df08350dSYeting Kuo    <vscale x 1 x float> %1,
218df08350dSYeting Kuo    i64 7, i64 %2)
219df08350dSYeting Kuo  call void @foo()
220df08350dSYeting Kuo  ret <vscale x 1 x float> %a
221df08350dSYeting Kuo}
222df08350dSYeting Kuo
223df08350dSYeting Kuodefine <vscale x 1 x float> @after_call1(<vscale x 1 x float> %0, <vscale x 1 x float> %1, i64 %2) nounwind {
224df08350dSYeting Kuo; CHECK-LABEL: after_call1:
225df08350dSYeting Kuo; CHECK:       # %bb.0: # %entry
226df08350dSYeting Kuo; CHECK-NEXT:    addi sp, sp, -48
227df08350dSYeting Kuo; CHECK-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
228df08350dSYeting Kuo; CHECK-NEXT:    csrr a1, vlenb
229df08350dSYeting Kuo; CHECK-NEXT:    sub sp, sp, a1
2300ebe48f0SLuke Lau; CHECK-NEXT:    fsrmi a1, 0
231df08350dSYeting Kuo; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
232df08350dSYeting Kuo; CHECK-NEXT:    vfadd.vv v8, v8, v9
2330ebe48f0SLuke Lau; CHECK-NEXT:    addi a0, sp, 32
2340ebe48f0SLuke Lau; CHECK-NEXT:    vs1r.v v8, (a0) # Unknown-size Folded Spill
2350ebe48f0SLuke Lau; CHECK-NEXT:    fsrm a1
236df08350dSYeting Kuo; CHECK-NEXT:    call foo
237df08350dSYeting Kuo; CHECK-NEXT:    addi a0, sp, 32
238df08350dSYeting Kuo; CHECK-NEXT:    vl1r.v v8, (a0) # Unknown-size Folded Reload
239df08350dSYeting Kuo; CHECK-NEXT:    csrr a0, vlenb
240df08350dSYeting Kuo; CHECK-NEXT:    add sp, sp, a0
241df08350dSYeting Kuo; CHECK-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
242df08350dSYeting Kuo; CHECK-NEXT:    addi sp, sp, 48
243df08350dSYeting Kuo; CHECK-NEXT:    ret
244df08350dSYeting Kuo;
245df08350dSYeting Kuo; UNOPT-LABEL: after_call1:
246df08350dSYeting Kuo; UNOPT:       # %bb.0: # %entry
247df08350dSYeting Kuo; UNOPT-NEXT:    addi sp, sp, -48
248df08350dSYeting Kuo; UNOPT-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
249df08350dSYeting Kuo; UNOPT-NEXT:    csrr a1, vlenb
250df08350dSYeting Kuo; UNOPT-NEXT:    sub sp, sp, a1
2510ebe48f0SLuke Lau; UNOPT-NEXT:    fsrmi a1, 0
252df08350dSYeting Kuo; UNOPT-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
253df08350dSYeting Kuo; UNOPT-NEXT:    vfadd.vv v8, v8, v9
2540ebe48f0SLuke Lau; UNOPT-NEXT:    addi a0, sp, 32
2550ebe48f0SLuke Lau; UNOPT-NEXT:    vs1r.v v8, (a0) # Unknown-size Folded Spill
2560ebe48f0SLuke Lau; UNOPT-NEXT:    fsrm a1
257df08350dSYeting Kuo; UNOPT-NEXT:    call foo
258df08350dSYeting Kuo; UNOPT-NEXT:    addi a0, sp, 32
259df08350dSYeting Kuo; UNOPT-NEXT:    vl1r.v v8, (a0) # Unknown-size Folded Reload
260df08350dSYeting Kuo; UNOPT-NEXT:    csrr a0, vlenb
261df08350dSYeting Kuo; UNOPT-NEXT:    add sp, sp, a0
262df08350dSYeting Kuo; UNOPT-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
263df08350dSYeting Kuo; UNOPT-NEXT:    addi sp, sp, 48
264df08350dSYeting Kuo; UNOPT-NEXT:    ret
265df08350dSYeting Kuoentry:
266df08350dSYeting Kuo  %a = call <vscale x 1 x float> @llvm.riscv.vfadd.nxv1f32.nxv1f32(
267df08350dSYeting Kuo    <vscale x 1 x float> undef,
268df08350dSYeting Kuo    <vscale x 1 x float> %0,
269df08350dSYeting Kuo    <vscale x 1 x float> %1,
270df08350dSYeting Kuo    i64 0, i64 %2)
271df08350dSYeting Kuo  call void @foo()
272df08350dSYeting Kuo  ret <vscale x 1 x float> %a
273df08350dSYeting Kuo}
274df08350dSYeting Kuo
275df08350dSYeting Kuodefine <vscale x 1 x float> @after_call2(<vscale x 1 x float> %0, <vscale x 1 x float> %1, i64 %2) nounwind {
276df08350dSYeting Kuo; CHECK-LABEL: after_call2:
277df08350dSYeting Kuo; CHECK:       # %bb.0: # %entry
278df08350dSYeting Kuo; CHECK-NEXT:    addi sp, sp, -48
279df08350dSYeting Kuo; CHECK-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
280df08350dSYeting Kuo; CHECK-NEXT:    csrr a1, vlenb
281df08350dSYeting Kuo; CHECK-NEXT:    sub sp, sp, a1
282df08350dSYeting Kuo; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
283df08350dSYeting Kuo; CHECK-NEXT:    vfadd.vv v8, v8, v9
284df08350dSYeting Kuo; CHECK-NEXT:    addi a0, sp, 32
285df08350dSYeting Kuo; CHECK-NEXT:    vs1r.v v8, (a0) # Unknown-size Folded Spill
286df08350dSYeting Kuo; CHECK-NEXT:    call foo
287df08350dSYeting Kuo; CHECK-NEXT:    addi a0, sp, 32
288df08350dSYeting Kuo; CHECK-NEXT:    vl1r.v v8, (a0) # Unknown-size Folded Reload
289df08350dSYeting Kuo; CHECK-NEXT:    csrr a0, vlenb
290df08350dSYeting Kuo; CHECK-NEXT:    add sp, sp, a0
291df08350dSYeting Kuo; CHECK-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
292df08350dSYeting Kuo; CHECK-NEXT:    addi sp, sp, 48
293df08350dSYeting Kuo; CHECK-NEXT:    ret
294df08350dSYeting Kuo;
295df08350dSYeting Kuo; UNOPT-LABEL: after_call2:
296df08350dSYeting Kuo; UNOPT:       # %bb.0: # %entry
297df08350dSYeting Kuo; UNOPT-NEXT:    addi sp, sp, -48
298df08350dSYeting Kuo; UNOPT-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
299df08350dSYeting Kuo; UNOPT-NEXT:    csrr a1, vlenb
300df08350dSYeting Kuo; UNOPT-NEXT:    sub sp, sp, a1
301df08350dSYeting Kuo; UNOPT-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
302df08350dSYeting Kuo; UNOPT-NEXT:    vfadd.vv v8, v8, v9
303df08350dSYeting Kuo; UNOPT-NEXT:    addi a0, sp, 32
304df08350dSYeting Kuo; UNOPT-NEXT:    vs1r.v v8, (a0) # Unknown-size Folded Spill
305df08350dSYeting Kuo; UNOPT-NEXT:    call foo
306df08350dSYeting Kuo; UNOPT-NEXT:    addi a0, sp, 32
307df08350dSYeting Kuo; UNOPT-NEXT:    vl1r.v v8, (a0) # Unknown-size Folded Reload
308df08350dSYeting Kuo; UNOPT-NEXT:    csrr a0, vlenb
309df08350dSYeting Kuo; UNOPT-NEXT:    add sp, sp, a0
310df08350dSYeting Kuo; UNOPT-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
311df08350dSYeting Kuo; UNOPT-NEXT:    addi sp, sp, 48
312df08350dSYeting Kuo; UNOPT-NEXT:    ret
313df08350dSYeting Kuoentry:
314df08350dSYeting Kuo  %a = call <vscale x 1 x float> @llvm.riscv.vfadd.nxv1f32.nxv1f32(
315df08350dSYeting Kuo    <vscale x 1 x float> undef,
316df08350dSYeting Kuo    <vscale x 1 x float> %0,
317df08350dSYeting Kuo    <vscale x 1 x float> %1,
318df08350dSYeting Kuo    i64 7, i64 %2)
319df08350dSYeting Kuo  call void @foo()
320df08350dSYeting Kuo  ret <vscale x 1 x float> %a
321df08350dSYeting Kuo}
322df08350dSYeting Kuo
323df08350dSYeting Kuodefine <vscale x 1 x float> @just_asm(<vscale x 1 x float> %0) nounwind {
324df08350dSYeting Kuo; CHECK-LABEL: just_asm:
325df08350dSYeting Kuo; CHECK:       # %bb.0: # %entry
326df08350dSYeting Kuo; CHECK-NEXT:    #APP
327df08350dSYeting Kuo; CHECK-NEXT:    #NO_APP
328df08350dSYeting Kuo; CHECK-NEXT:    ret
329df08350dSYeting Kuo;
330df08350dSYeting Kuo; UNOPT-LABEL: just_asm:
331df08350dSYeting Kuo; UNOPT:       # %bb.0: # %entry
332df08350dSYeting Kuo; UNOPT-NEXT:    #APP
333df08350dSYeting Kuo; UNOPT-NEXT:    #NO_APP
334df08350dSYeting Kuo; UNOPT-NEXT:    ret
335df08350dSYeting Kuoentry:
336df08350dSYeting Kuo  call void asm sideeffect "", ""()
337df08350dSYeting Kuo  ret <vscale x 1 x float> %0
338df08350dSYeting Kuo}
339df08350dSYeting Kuo
340df08350dSYeting Kuodefine <vscale x 1 x float> @before_asm1(<vscale x 1 x float> %0, <vscale x 1 x float> %1, i64 %2) nounwind {
341df08350dSYeting Kuo; CHECK-LABEL: before_asm1:
342df08350dSYeting Kuo; CHECK:       # %bb.0: # %entry
3430ebe48f0SLuke Lau; CHECK-NEXT:    fsrmi a1, 0
344df08350dSYeting Kuo; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
345df08350dSYeting Kuo; CHECK-NEXT:    vfadd.vv v8, v8, v9
3460ebe48f0SLuke Lau; CHECK-NEXT:    fsrm a1
347df08350dSYeting Kuo; CHECK-NEXT:    #APP
348df08350dSYeting Kuo; CHECK-NEXT:    #NO_APP
349df08350dSYeting Kuo; CHECK-NEXT:    ret
350df08350dSYeting Kuo;
351df08350dSYeting Kuo; UNOPT-LABEL: before_asm1:
352df08350dSYeting Kuo; UNOPT:       # %bb.0: # %entry
3530ebe48f0SLuke Lau; UNOPT-NEXT:    fsrmi a1, 0
354df08350dSYeting Kuo; UNOPT-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
355df08350dSYeting Kuo; UNOPT-NEXT:    vfadd.vv v8, v8, v9
3560ebe48f0SLuke Lau; UNOPT-NEXT:    fsrm a1
357df08350dSYeting Kuo; UNOPT-NEXT:    #APP
358df08350dSYeting Kuo; UNOPT-NEXT:    #NO_APP
359df08350dSYeting Kuo; UNOPT-NEXT:    ret
360df08350dSYeting Kuoentry:
361df08350dSYeting Kuo  %a = call <vscale x 1 x float> @llvm.riscv.vfadd.nxv1f32.nxv1f32(
362df08350dSYeting Kuo    <vscale x 1 x float> undef,
363df08350dSYeting Kuo    <vscale x 1 x float> %0,
364df08350dSYeting Kuo    <vscale x 1 x float> %1,
365df08350dSYeting Kuo    i64 0, i64 %2)
366df08350dSYeting Kuo  call void asm sideeffect "", ""()
367df08350dSYeting Kuo  ret <vscale x 1 x float> %a
368df08350dSYeting Kuo}
369df08350dSYeting Kuo
370df08350dSYeting Kuodefine <vscale x 1 x float> @before_asm2(<vscale x 1 x float> %0, <vscale x 1 x float> %1, i64 %2) nounwind {
371df08350dSYeting Kuo; CHECK-LABEL: before_asm2:
372df08350dSYeting Kuo; CHECK:       # %bb.0: # %entry
373df08350dSYeting Kuo; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
374df08350dSYeting Kuo; CHECK-NEXT:    vfadd.vv v8, v8, v9
375df08350dSYeting Kuo; CHECK-NEXT:    #APP
376df08350dSYeting Kuo; CHECK-NEXT:    #NO_APP
377df08350dSYeting Kuo; CHECK-NEXT:    ret
378df08350dSYeting Kuo;
379df08350dSYeting Kuo; UNOPT-LABEL: before_asm2:
380df08350dSYeting Kuo; UNOPT:       # %bb.0: # %entry
381df08350dSYeting Kuo; UNOPT-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
382df08350dSYeting Kuo; UNOPT-NEXT:    vfadd.vv v8, v8, v9
383df08350dSYeting Kuo; UNOPT-NEXT:    #APP
384df08350dSYeting Kuo; UNOPT-NEXT:    #NO_APP
385df08350dSYeting Kuo; UNOPT-NEXT:    ret
386df08350dSYeting Kuoentry:
387df08350dSYeting Kuo  %a = call <vscale x 1 x float> @llvm.riscv.vfadd.nxv1f32.nxv1f32(
388df08350dSYeting Kuo    <vscale x 1 x float> undef,
389df08350dSYeting Kuo    <vscale x 1 x float> %0,
390df08350dSYeting Kuo    <vscale x 1 x float> %1,
391df08350dSYeting Kuo    i64 7, i64 %2)
392df08350dSYeting Kuo  call void asm sideeffect "", ""()
393df08350dSYeting Kuo  ret <vscale x 1 x float> %a
394df08350dSYeting Kuo}
395df08350dSYeting Kuo
396df08350dSYeting Kuodefine <vscale x 1 x float> @after_asm1(<vscale x 1 x float> %0, <vscale x 1 x float> %1, i64 %2) nounwind {
397df08350dSYeting Kuo; CHECK-LABEL: after_asm1:
398df08350dSYeting Kuo; CHECK:       # %bb.0: # %entry
3990ebe48f0SLuke Lau; CHECK-NEXT:    fsrmi a1, 0
400df08350dSYeting Kuo; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
401df08350dSYeting Kuo; CHECK-NEXT:    vfadd.vv v8, v8, v9
4020ebe48f0SLuke Lau; CHECK-NEXT:    fsrm a1
403df08350dSYeting Kuo; CHECK-NEXT:    #APP
404df08350dSYeting Kuo; CHECK-NEXT:    #NO_APP
405df08350dSYeting Kuo; CHECK-NEXT:    ret
406df08350dSYeting Kuo;
407df08350dSYeting Kuo; UNOPT-LABEL: after_asm1:
408df08350dSYeting Kuo; UNOPT:       # %bb.0: # %entry
4090ebe48f0SLuke Lau; UNOPT-NEXT:    fsrmi a1, 0
410df08350dSYeting Kuo; UNOPT-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
411df08350dSYeting Kuo; UNOPT-NEXT:    vfadd.vv v8, v8, v9
4120ebe48f0SLuke Lau; UNOPT-NEXT:    fsrm a1
413df08350dSYeting Kuo; UNOPT-NEXT:    #APP
414df08350dSYeting Kuo; UNOPT-NEXT:    #NO_APP
415df08350dSYeting Kuo; UNOPT-NEXT:    ret
416df08350dSYeting Kuoentry:
417df08350dSYeting Kuo  %a = call <vscale x 1 x float> @llvm.riscv.vfadd.nxv1f32.nxv1f32(
418df08350dSYeting Kuo    <vscale x 1 x float> undef,
419df08350dSYeting Kuo    <vscale x 1 x float> %0,
420df08350dSYeting Kuo    <vscale x 1 x float> %1,
421df08350dSYeting Kuo    i64 0, i64 %2)
422df08350dSYeting Kuo  call void asm sideeffect "", ""()
423df08350dSYeting Kuo  ret <vscale x 1 x float> %a
424df08350dSYeting Kuo}
425df08350dSYeting Kuo
426df08350dSYeting Kuodefine <vscale x 1 x float> @after_asm2(<vscale x 1 x float> %0, <vscale x 1 x float> %1, i64 %2) nounwind {
427df08350dSYeting Kuo; CHECK-LABEL: after_asm2:
428df08350dSYeting Kuo; CHECK:       # %bb.0: # %entry
429df08350dSYeting Kuo; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
430df08350dSYeting Kuo; CHECK-NEXT:    vfadd.vv v8, v8, v9
431df08350dSYeting Kuo; CHECK-NEXT:    #APP
432df08350dSYeting Kuo; CHECK-NEXT:    #NO_APP
433df08350dSYeting Kuo; CHECK-NEXT:    ret
434df08350dSYeting Kuo;
435df08350dSYeting Kuo; UNOPT-LABEL: after_asm2:
436df08350dSYeting Kuo; UNOPT:       # %bb.0: # %entry
437df08350dSYeting Kuo; UNOPT-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
438df08350dSYeting Kuo; UNOPT-NEXT:    vfadd.vv v8, v8, v9
439df08350dSYeting Kuo; UNOPT-NEXT:    #APP
440df08350dSYeting Kuo; UNOPT-NEXT:    #NO_APP
441df08350dSYeting Kuo; UNOPT-NEXT:    ret
442df08350dSYeting Kuoentry:
443df08350dSYeting Kuo  %a = call <vscale x 1 x float> @llvm.riscv.vfadd.nxv1f32.nxv1f32(
444df08350dSYeting Kuo    <vscale x 1 x float> undef,
445df08350dSYeting Kuo    <vscale x 1 x float> %0,
446df08350dSYeting Kuo    <vscale x 1 x float> %1,
447df08350dSYeting Kuo    i64 7, i64 %2)
448df08350dSYeting Kuo  call void asm sideeffect "", ""()
449df08350dSYeting Kuo  ret <vscale x 1 x float> %a
450df08350dSYeting Kuo}
451df08350dSYeting Kuo
452df08350dSYeting Kuo; Test restoring frm before reading frm and doing nothing with following
453df08350dSYeting Kuo; dynamic rounding mode operations.
454df08350dSYeting Kuo; TODO: The frrm could be elided.
455df08350dSYeting Kuodeclare i32 @llvm.get.rounding()
456df08350dSYeting Kuodefine <vscale x 1 x float> @test5(<vscale x 1 x float> %0, <vscale x 1 x float> %1, i64 %2, ptr %p) nounwind {
457df08350dSYeting Kuo; CHECK-LABEL: test5:
458df08350dSYeting Kuo; CHECK:       # %bb.0: # %entry
4590ebe48f0SLuke Lau; CHECK-NEXT:    fsrmi a2, 0
460df08350dSYeting Kuo; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
461df08350dSYeting Kuo; CHECK-NEXT:    vfadd.vv v8, v8, v9
462*9122c523SPengcheng Wang; CHECK-NEXT:    lui a0, 66
4630ebe48f0SLuke Lau; CHECK-NEXT:    fsrm a2
464*9122c523SPengcheng Wang; CHECK-NEXT:    addiw a0, a0, 769
465*9122c523SPengcheng Wang; CHECK-NEXT:    frrm a2
466*9122c523SPengcheng Wang; CHECK-NEXT:    slli a2, a2, 2
467*9122c523SPengcheng Wang; CHECK-NEXT:    srl a0, a0, a2
468df08350dSYeting Kuo; CHECK-NEXT:    andi a0, a0, 7
469df08350dSYeting Kuo; CHECK-NEXT:    vfadd.vv v8, v8, v8
470df08350dSYeting Kuo; CHECK-NEXT:    sw a0, 0(a1)
471df08350dSYeting Kuo; CHECK-NEXT:    ret
472df08350dSYeting Kuo;
473df08350dSYeting Kuo; UNOPT-LABEL: test5:
474df08350dSYeting Kuo; UNOPT:       # %bb.0: # %entry
4750ebe48f0SLuke Lau; UNOPT-NEXT:    fsrmi a2, 0
476df08350dSYeting Kuo; UNOPT-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
477df08350dSYeting Kuo; UNOPT-NEXT:    vfadd.vv v8, v8, v9
478*9122c523SPengcheng Wang; UNOPT-NEXT:    lui a0, 66
4790ebe48f0SLuke Lau; UNOPT-NEXT:    fsrm a2
480*9122c523SPengcheng Wang; UNOPT-NEXT:    addiw a0, a0, 769
481*9122c523SPengcheng Wang; UNOPT-NEXT:    frrm a2
482*9122c523SPengcheng Wang; UNOPT-NEXT:    slli a2, a2, 2
483*9122c523SPengcheng Wang; UNOPT-NEXT:    srl a0, a0, a2
484df08350dSYeting Kuo; UNOPT-NEXT:    andi a0, a0, 7
485df08350dSYeting Kuo; UNOPT-NEXT:    vfadd.vv v8, v8, v8
486df08350dSYeting Kuo; UNOPT-NEXT:    sw a0, 0(a1)
487df08350dSYeting Kuo; UNOPT-NEXT:    ret
488df08350dSYeting Kuoentry:
489df08350dSYeting Kuo  %a = call <vscale x 1 x float> @llvm.riscv.vfadd.nxv1f32.nxv1f32(
490df08350dSYeting Kuo    <vscale x 1 x float> undef,
491df08350dSYeting Kuo    <vscale x 1 x float> %0,
492df08350dSYeting Kuo    <vscale x 1 x float> %1,
493df08350dSYeting Kuo    i64 0, i64 %2)
494df08350dSYeting Kuo  %rm = call i32 @llvm.get.rounding()
495df08350dSYeting Kuo  store i32 %rm, ptr %p, align 4
496df08350dSYeting Kuo  %b = call <vscale x 1 x float> @llvm.riscv.vfadd.nxv1f32.nxv1f32(
497df08350dSYeting Kuo    <vscale x 1 x float> undef,
498df08350dSYeting Kuo    <vscale x 1 x float> %a,
499df08350dSYeting Kuo    <vscale x 1 x float> %a,
500df08350dSYeting Kuo    i64 7, i64 %2)
501df08350dSYeting Kuo  ret <vscale x 1 x float> %b
502df08350dSYeting Kuo}
503df08350dSYeting Kuo
504df08350dSYeting Kuo; Test not set FRM for vfadd with DYN after WriteFRMImm.
505df08350dSYeting Kuodeclare void @llvm.set.rounding(i32)
506df08350dSYeting Kuodefine <vscale x 1 x float> @after_fsrm1(<vscale x 1 x float> %0, <vscale x 1 x float> %1, i64 %2) nounwind {
507df08350dSYeting Kuo; CHECK-LABEL: after_fsrm1:
508df08350dSYeting Kuo; CHECK:       # %bb.0: # %entry
509df08350dSYeting Kuo; CHECK-NEXT:    fsrmi 4
510df08350dSYeting Kuo; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
511df08350dSYeting Kuo; CHECK-NEXT:    vfadd.vv v8, v8, v9
512df08350dSYeting Kuo; CHECK-NEXT:    ret
513df08350dSYeting Kuo;
514df08350dSYeting Kuo; UNOPT-LABEL: after_fsrm1:
515df08350dSYeting Kuo; UNOPT:       # %bb.0: # %entry
516df08350dSYeting Kuo; UNOPT-NEXT:    fsrmi 4
517df08350dSYeting Kuo; UNOPT-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
518df08350dSYeting Kuo; UNOPT-NEXT:    vfadd.vv v8, v8, v9
519df08350dSYeting Kuo; UNOPT-NEXT:    ret
520df08350dSYeting Kuoentry:
521df08350dSYeting Kuo  call void @llvm.set.rounding(i32 4)
522df08350dSYeting Kuo  %a = call <vscale x 1 x float> @llvm.riscv.vfadd.nxv1f32.nxv1f32(
523df08350dSYeting Kuo    <vscale x 1 x float> undef,
524df08350dSYeting Kuo    <vscale x 1 x float> %0,
525df08350dSYeting Kuo    <vscale x 1 x float> %1,
526df08350dSYeting Kuo    i64 7, i64 %2)
527df08350dSYeting Kuo  ret <vscale x 1 x float> %a
528df08350dSYeting Kuo}
529df08350dSYeting Kuo
530df08350dSYeting Kuo; Test not set FRM for vfadd with a known rm after WriteFRMImm with same rm.
531df08350dSYeting Kuodefine <vscale x 1 x float> @after_fsrm2(<vscale x 1 x float> %0, <vscale x 1 x float> %1, i64 %2) nounwind {
532df08350dSYeting Kuo; CHECK-LABEL: after_fsrm2:
533df08350dSYeting Kuo; CHECK:       # %bb.0: # %entry
534df08350dSYeting Kuo; CHECK-NEXT:    fsrmi 4
535df08350dSYeting Kuo; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
536df08350dSYeting Kuo; CHECK-NEXT:    vfadd.vv v8, v8, v9
537df08350dSYeting Kuo; CHECK-NEXT:    ret
538df08350dSYeting Kuo;
539df08350dSYeting Kuo; UNOPT-LABEL: after_fsrm2:
540df08350dSYeting Kuo; UNOPT:       # %bb.0: # %entry
541df08350dSYeting Kuo; UNOPT-NEXT:    fsrmi 4
5420ebe48f0SLuke Lau; UNOPT-NEXT:    fsrmi a1, 4
543df08350dSYeting Kuo; UNOPT-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
544df08350dSYeting Kuo; UNOPT-NEXT:    vfadd.vv v8, v8, v9
5450ebe48f0SLuke Lau; UNOPT-NEXT:    fsrm a1
546df08350dSYeting Kuo; UNOPT-NEXT:    ret
547df08350dSYeting Kuoentry:
548df08350dSYeting Kuo  call void @llvm.set.rounding(i32 4)
549df08350dSYeting Kuo  %a = call <vscale x 1 x float> @llvm.riscv.vfadd.nxv1f32.nxv1f32(
550df08350dSYeting Kuo    <vscale x 1 x float> undef,
551df08350dSYeting Kuo    <vscale x 1 x float> %0,
552df08350dSYeting Kuo    <vscale x 1 x float> %1,
553df08350dSYeting Kuo    i64 4, i64 %2)
554df08350dSYeting Kuo  ret <vscale x 1 x float> %a
555df08350dSYeting Kuo}
556df08350dSYeting Kuo
557df08350dSYeting Kuo; Test not set FRM for vfadd with a known rm after WriteFRMImm with same rm.
558df08350dSYeting Kuodefine <vscale x 1 x float> @after_fsrm3(<vscale x 1 x float> %0, <vscale x 1 x float> %1, i64 %2) nounwind {
559df08350dSYeting Kuo; CHECK-LABEL: after_fsrm3:
560df08350dSYeting Kuo; CHECK:       # %bb.0: # %entry
561df08350dSYeting Kuo; CHECK-NEXT:    fsrmi 4
562c3724ba8SCraig Topper; CHECK-NEXT:    fsrmi a1, 3
563df08350dSYeting Kuo; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
564df08350dSYeting Kuo; CHECK-NEXT:    vfadd.vv v8, v8, v9
5650ebe48f0SLuke Lau; CHECK-NEXT:    fsrm a1
566df08350dSYeting Kuo; CHECK-NEXT:    ret
567df08350dSYeting Kuo;
568df08350dSYeting Kuo; UNOPT-LABEL: after_fsrm3:
569df08350dSYeting Kuo; UNOPT:       # %bb.0: # %entry
570df08350dSYeting Kuo; UNOPT-NEXT:    fsrmi 4
571c3724ba8SCraig Topper; UNOPT-NEXT:    fsrmi a1, 3
572df08350dSYeting Kuo; UNOPT-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
573df08350dSYeting Kuo; UNOPT-NEXT:    vfadd.vv v8, v8, v9
5740ebe48f0SLuke Lau; UNOPT-NEXT:    fsrm a1
575df08350dSYeting Kuo; UNOPT-NEXT:    ret
576df08350dSYeting Kuoentry:
577df08350dSYeting Kuo  call void @llvm.set.rounding(i32 4)
578df08350dSYeting Kuo  %a = call <vscale x 1 x float> @llvm.riscv.vfadd.nxv1f32.nxv1f32(
579df08350dSYeting Kuo    <vscale x 1 x float> undef,
580df08350dSYeting Kuo    <vscale x 1 x float> %0,
581df08350dSYeting Kuo    <vscale x 1 x float> %1,
582c3724ba8SCraig Topper    i64 3, i64 %2)
583df08350dSYeting Kuo  ret <vscale x 1 x float> %a
584df08350dSYeting Kuo}
585df08350dSYeting Kuo
586df08350dSYeting Kuo; Test not set FRM for the vfadd after WriteFRM.
587df08350dSYeting Kuodefine <vscale x 1 x float> @after_fsrm4(<vscale x 1 x float> %0, <vscale x 1 x float> %1, i32 %rm, i64 %2) nounwind {
588df08350dSYeting Kuo; CHECK-LABEL: after_fsrm4:
589df08350dSYeting Kuo; CHECK:       # %bb.0: # %entry
590df08350dSYeting Kuo; CHECK-NEXT:    slli a0, a0, 32
591df08350dSYeting Kuo; CHECK-NEXT:    lui a2, 66
592*9122c523SPengcheng Wang; CHECK-NEXT:    srli a0, a0, 30
593df08350dSYeting Kuo; CHECK-NEXT:    addiw a2, a2, 769
594df08350dSYeting Kuo; CHECK-NEXT:    srl a0, a2, a0
595df08350dSYeting Kuo; CHECK-NEXT:    andi a0, a0, 7
596df08350dSYeting Kuo; CHECK-NEXT:    fsrm a0
597df08350dSYeting Kuo; CHECK-NEXT:    vsetvli zero, a1, e32, mf2, ta, ma
598df08350dSYeting Kuo; CHECK-NEXT:    vfadd.vv v8, v8, v9
599df08350dSYeting Kuo; CHECK-NEXT:    ret
600df08350dSYeting Kuo;
601df08350dSYeting Kuo; UNOPT-LABEL: after_fsrm4:
602df08350dSYeting Kuo; UNOPT:       # %bb.0: # %entry
603df08350dSYeting Kuo; UNOPT-NEXT:    slli a0, a0, 32
604df08350dSYeting Kuo; UNOPT-NEXT:    lui a2, 66
605*9122c523SPengcheng Wang; UNOPT-NEXT:    srli a0, a0, 30
606df08350dSYeting Kuo; UNOPT-NEXT:    addiw a2, a2, 769
607df08350dSYeting Kuo; UNOPT-NEXT:    srl a0, a2, a0
608df08350dSYeting Kuo; UNOPT-NEXT:    andi a0, a0, 7
609df08350dSYeting Kuo; UNOPT-NEXT:    fsrm a0
610df08350dSYeting Kuo; UNOPT-NEXT:    vsetvli zero, a1, e32, mf2, ta, ma
611df08350dSYeting Kuo; UNOPT-NEXT:    vfadd.vv v8, v8, v9
612df08350dSYeting Kuo; UNOPT-NEXT:    ret
613df08350dSYeting Kuoentry:
614df08350dSYeting Kuo  call void @llvm.set.rounding(i32 %rm)
615df08350dSYeting Kuo  %a = call <vscale x 1 x float> @llvm.riscv.vfadd.nxv1f32.nxv1f32(
616df08350dSYeting Kuo    <vscale x 1 x float> undef,
617df08350dSYeting Kuo    <vscale x 1 x float> %0,
618df08350dSYeting Kuo    <vscale x 1 x float> %1,
619df08350dSYeting Kuo    i64 7, i64 %2)
620df08350dSYeting Kuo  ret <vscale x 1 x float> %a
621df08350dSYeting Kuo}
622