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