]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
RISC-V: Fix vec_duplicate[bimode] expander [PR119572].
authorRobin Dapp <rdapp@ventanamicro.com>
Tue, 1 Apr 2025 19:17:54 +0000 (21:17 +0200)
committerRobin Dapp <rdapp@ventanamicro.com>
Wed, 2 Apr 2025 19:41:18 +0000 (21:41 +0200)
Since r15-9062-g70391e3958db79 we perform vector bitmask initialization
via the vec_duplicate expander directly.  This triggered a latent bug in
ours where we missed to mask out the single bit which resulted in an
execution FAIL of pr119114.c

The attached patch adds the 1-masking of the broadcast operand.

PR target/119572

gcc/ChangeLog:

* config/riscv/autovec.md: Mask broadcast value.

gcc/config/riscv/autovec.md

index f53ed3a5e3fd0772a3bd9b8e4d67e4cdf9b32be1..9e51e3ce6a30f0ff8a6ffc9ddd63a184b44cb014 100644 (file)
   {
     poly_int64 nunits = GET_MODE_NUNITS (<MODE>mode);
     machine_mode mode = riscv_vector::get_vector_mode (QImode, nunits).require ();
-    rtx dup = expand_vector_broadcast (mode, operands[1]);
+
+    /* The 1-bit mask is in a QImode register, make sure we only use the last
+       bit.  See also PR119114 and the respective vec_init expander.  */
+    rtx tmp = gen_reg_rtx (Xmode);
+    emit_insn
+      (gen_rtx_SET (tmp, gen_rtx_AND (Xmode, gen_lowpart (Xmode, operands[1]),
+                                     CONST1_RTX (Xmode))));
+
+    rtx dup = expand_vector_broadcast (mode, gen_lowpart (QImode, tmp));
     riscv_vector::expand_vec_cmp (operands[0], NE, dup, CONST0_RTX (mode));
     DONE;
   }