diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
index 439cc12f93d5dee816fc663098cf9253f1d67bec..819e1538741734f0c0e234f6b9abfaee5b7b019c 100644
--- a/gcc/config/riscv/riscv.cc
+++ b/gcc/config/riscv/riscv.cc
@@ -10900,7 +10900,9 @@ riscv_conditional_register_usage (void)
 	call_used_regs[regno] = 1;
     }
 
-  if (!TARGET_VECTOR)
+  if (TARGET_VECTOR)
+    global_regs[VXRM_REGNUM] = 1;
+  else
     {
       for (int regno = V_REG_FIRST; regno <= V_REG_LAST; regno++)
 	fixed_regs[regno] = call_used_regs[regno] = 1;
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/base/pr118103-2.c b/gcc/testsuite/gcc.target/riscv/rvv/base/pr118103-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..d6e3aa090777b39ee5974fad193820977f9f9124
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/pr118103-2.c
@@ -0,0 +1,40 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -march=rv64gcv -mabi=lp64d" } */
+
+#include "riscv_vector.h"
+
+#define N 4
+uint16_t a[N];
+uint16_t b[N];
+uint16_t c[N];
+
+void initialize ()
+{
+  uint16_t tmp_0[N] = { 0xfff, 3213, 238, 275, };
+
+  for (int i = 0; i < N; ++i)
+    a[i] = b[i] = tmp_0[i];
+
+  for (int i = 0; i < N; ++i)
+    c[i] = 0;
+}
+
+void compute ()
+{
+  size_t vl = __riscv_vsetvl_e16m1 (N);
+  vuint16m1_t va = __riscv_vle16_v_u16m1 (a, vl);
+  vuint16m1_t vb = __riscv_vle16_v_u16m1 (b, vl);
+  vuint16m1_t vc = __riscv_vaaddu_vv_u16m1 (va, vb, __RISCV_VXRM_RDN, vl);
+
+  __riscv_vse16_v_u16m1 (c, vc, vl);
+}
+
+int main ()
+{
+  initialize ();
+  compute();
+
+  return 0;
+}
+
+/* { dg-final { scan-assembler-times {csrwi\s+vxrm,\s*[01234]} 2 } } */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/base/pr118103-run-2.c b/gcc/testsuite/gcc.target/riscv/rvv/base/pr118103-run-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..89150d4f6b592727b09ebaea673d233eaead6add
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/pr118103-run-2.c
@@ -0,0 +1,44 @@
+/* { dg-do run { target { riscv_v } } } */
+/* { dg-options "-O3" } */
+
+#include "riscv_vector.h"
+
+#define N 4
+uint16_t a[N];
+uint16_t b[N];
+uint16_t c[N];
+
+void initialize () {
+  uint16_t tmp_0[N] = { 0xfff, 3213, 238, 275, };
+  uint16_t tmp_1[N] = { 0x2,  823,  39,   9, };
+
+  for (int i = 0; i < N; ++i)
+    {
+      a[i] = tmp_0[i];
+      b[i] = tmp_1[i];
+    }
+
+  for (int i = 0; i < N; ++i)
+    c[i] = 0;
+}
+
+void compute ()
+{
+  size_t vl = __riscv_vsetvl_e16m1 (N);
+  vuint16m1_t va = __riscv_vle16_v_u16m1 (a, vl);
+  vuint16m1_t vb = __riscv_vle16_v_u16m1 (b, vl);
+  vuint16m1_t vc = __riscv_vaaddu_vv_u16m1 (va, vb, __RISCV_VXRM_RDN, vl);
+
+  __riscv_vse16_v_u16m1 (c, vc, vl);
+}
+
+int main ()
+{
+  initialize ();
+  compute ();
+
+  if (c[0] != 2048)
+    __builtin_abort ();
+
+  return 0;
+}