https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119007

            Bug ID: 119007
           Summary: RISC-V: The optimization ignored the side effects of
                    the rounding mode, resulting in incorrect results for
                    rvv
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: majin at gcc dot gnu.org
  Target Milestone: ---

Here is a record for now, as there isn't a better way at the moment.

REF:
https://patchwork.sourceware.org/project/gcc/patch/20250218111258.839-1-ji...@linux.alibaba.com/

/* { dg-do run { target { riscv_v } } } */
/* { dg-options "-march=rv64gcv_zvfh -mabi=lp64d -O2" } */

#include <riscv_vector.h>

int main ()
{
  float data_store = 0;
  int8_t mask = 1;
  size_t vl = 1;
  float data_load = 0.0;
  _Float16 data_sub = 0.0;
  vint8mf8_t mask_value = __riscv_vle8_v_i8mf8 (&mask, vl);
  vbool64_t vmask = __riscv_vmseq_vx_i8mf8_b64 (mask_value, 1, vl);
  vfloat32mf2_t vd_load = __riscv_vfmv_v_f_f32mf2 (0, __riscv_vsetvlmax_e32mf2
());
  vfloat32mf2_t vreg_memory = __riscv_vle32_v_f32mf2_tu (vd_load, &data_load,
vl);
  vfloat32mf2_t vreg = __riscv_vfwsub_wf_f32mf2_rm_tum (vmask, vreg_memory,
vreg_memory, data_sub, __RISCV_FRM_RDN, vl);
  __riscv_vse32_v_f32mf2 (&data_store, vreg, vl);

  __builtin_printf ("%f\n", data_store);
  return 0;
}

/* { dg-output "-0.000000\\s+\n" } */

Reply via email to