On Fri, 9 Jul 2021, Segher Boessenkool wrote:

> On Fri, Jul 09, 2021 at 08:43:59AM +0200, Richard Biener wrote:
> > I wonder if there's a way to query the target what modes the doloop
> > pattern can handle (not being too familiar with the doloop code).
> 
> You can look what modes are allowed for operand 0 of doloop_end,
> perhaps?  Although that is a define_expand, not a define_insn, so it is
> hard to introspect.
> 
> > Why do you need to do any checks besides the new type being able to
> > represent all IV values?  The original doloop IV will never wrap
> > (OTOH if niter is U*_MAX then we compute niter + 1 which will become
> > zero ... I suppose the doloop might still do the correct thing here
> > but it also still will with a IV with larger type).
> 
> doloop_valid_p guarantees it is simple and doesn't wrap.
> 
> > I'd have expected sth like
> > 
> >    ntype = lang_hooks.types.type_for_mode (word_mode, TYPE_UNSIGNED 
> > (ntype));
> > 
> > thus the decision made using a mode - which is also why I wonder
> > if there's a way to query the target for this.  As you say,
> > it _may_ be fast, so better check (somehow).
> 
> Almost all targets just use Pmode, but there is no such guarantee I
> think, and esp. some targets that do not have machine insns for this
> (but want to generate different code for this anyway) can do pretty much
> anything.
> 
> Maybe using just Pmode here is good enough though?

I think Pmode is a particularly bad choice and I'd prefer word_mode
if we go for any hardcoded mode.  s390x for example seems to handle
both SImode and DImode (but names the helper gen_doloop_si64
for SImode?!).  But indeed it looks like somehow querying doloop_end
is going to be difficult since the expander doesn't have any mode,
so we'd have to actually try emit RTL here.

Richard.

Reply via email to