This patch fix bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110962
SUBROUTINE a(b,c,d) LOGICAL,DIMENSION(INOUT) :: b LOGICAL e REAL, DIMENSION(IN) :: c REAL, DIMENSION(INOUT) :: d REAL, DIMENSION(SIZE(c)) :: f WHERE (b.AND.e) WHERE (f>=0.) d = g ENDWHERE ENDWHERE END SUBROUTINE a PR target/110962 gcc/ChangeLog: * config/riscv/autovec.md (vec_duplicate<mode>): New pattern. --- gcc/config/riscv/autovec.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/gcc/config/riscv/autovec.md b/gcc/config/riscv/autovec.md index 6cb5fa3ed27..3b396a9a990 100644 --- a/gcc/config/riscv/autovec.md +++ b/gcc/config/riscv/autovec.md @@ -287,6 +287,27 @@ ;; == Vector creation ;; ========================================================================= +;; ------------------------------------------------------------------------- +;; ---- [BOOL] Duplicate element +;; ------------------------------------------------------------------------- +;; The patterns in this section are synthetic. +;; ------------------------------------------------------------------------- + +;; Implement a predicate broadcast by shifting the low bit of the scalar +;; input into the top bit by duplicate the input and do a compare with zero. +(define_expand "vec_duplicate<mode>" + [(set (match_operand:VB 0 "register_operand") + (vec_duplicate:VB (match_operand:QI 1 "register_operand")))] + "TARGET_VECTOR" + { + 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]); + riscv_vector::expand_vec_cmp (operands[0], NE, dup, CONST0_RTX (mode)); + DONE; + } +) + ;; ------------------------------------------------------------------------- ;; ---- [INT] Linear series ;; ------------------------------------------------------------------------- -- 2.36.3