On Fri, Jul 30, 2021 at 8:40 AM Richard Sandiford <richard.sandif...@arm.com> wrote: > > "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;
I made the change and checked it in. Thank you very much for your help. > OK with that change, thanks, no need to repost. (And thanks for > your patience.) > > Richard -- H.J.