"H.J. Lu via Gcc-patches" <gcc-patches@gcc.gnu.org> writes: > +/* Callback routine for store_by_pieces. Read GET_MODE_BITSIZE (MODE) > + bytes from constant string DATA + OFFSET and return it as target > + constant. If PREV isn't nullptr, it has the RTL info from the > + previous iteration. */ > > +rtx > +builtin_memset_read_str (void *data, void *prev, > + HOST_WIDE_INT offset ATTRIBUTE_UNUSED, > + fixed_size_mode mode) > +{ > const char *c = (const char *) data; > - char *p = XALLOCAVEC (char, GET_MODE_SIZE (mode)); > + unsigned int size = GET_MODE_SIZE (mode); > > - memset (p, *c, GET_MODE_SIZE (mode)); > + rtx target = gen_memset_value_from_prev ((by_pieces_prev *) prev, > + mode); > + if (target != nullptr) > + return target; > + rtx src = gen_int_mode (*c, QImode); > > - return c_readstr (p, mode); > + if (VECTOR_MODE_P (mode)) > + { > + gcc_assert (GET_MODE_INNER (mode) == QImode); > + > + rtx const_vec = gen_const_vec_duplicate (mode, src); > + if (prev == NULL) > + /* Return CONST_VECTOR when called by a query function. */ > + target = const_vec; > + else > + { > + /* Use the move expander with CONST_VECTOR. */ > + target = targetm.gen_memset_scratch_rtx (mode); > + emit_move_insn (target, const_vec); > + } > + > + return target;
I guess this is personal preference, sorry, but it seems more obvious to me with an early return rather than an assignemnt to target: if (prev == NULL) /* Return CONST_VECTOR when called by a query function. */ return const_vec; /* Use the move expander with CONST_VECTOR. */ target = targetm.gen_memset_scratch_rtx (mode); emit_move_insn (target, const_vec); return target; OK with that change, thanks, no need to repost. (And thanks for your patience.) Richard