> -----Original Message-----
> From: Tamar Christina <[email protected]>
> Sent: 13 November 2025 13:37
> To: Richard Biener <[email protected]>
> Cc: [email protected]; nd <[email protected]>
> Subject: RE: [PATCH 1/2]middle-end: add target hook for isel
> 
> > -----Original Message-----
> > From: Richard Biener <[email protected]>
> > Sent: 13 November 2025 13:16
> > To: Tamar Christina <[email protected]>
> > Cc: [email protected]; nd <[email protected]>
> > Subject: Re: [PATCH 1/2]middle-end: add target hook for isel
> >
> > On Thu, 13 Nov 2025, Tamar Christina wrote:
> >
> > > This adds a new target hook to gimple-sel to allow targets to
> > > do target specific massaging of the gimple IL to prepare for
> > > expand.
> > >
> > > Tejas will be sending up part 2 of this soon to help convert
> > > SVE packed boolean VEC_COND_EXPR into something that we can
> > > handle more efficiently if expanded in a different order.
> > >
> > > We also want to use this to e.g. for Adv. SIMD prefer avoiding
> > > != vector compare expressions because the ISA doesn't have
> > > this instruction and so we expand to == + ~ but changing the
> > > expression from a MIN to MAX only for VECTOR_BOOLEAN_TYPE_P
> > > and flipping the operands we can expand more efficient.
> > >
> > > These are the kind of things we want to use the hook for,
> > > not generic changes that apply to all target.
> > >
> > > Bootstrapped Regtested on aarch64-none-linux-gnu and no issues.
> > >
> > > Ok for master pending submission of Tejas' patch?
> >
> > I'm refraining from bike-shedding on the name, but ... "preferred"?
> >
> 
> Understandable, my reasoning for using preferred is that because the
> hook runs first that other transformations may still transform it.
> 
> I thought about this when I added the hook and the reason I made it
> run first is that it's easier to figure out what your input is by looking
> at the previous pass output, but also think if the result of the
> transformation results in something isel would have normally changed
> that we still want this to happen.
> 
> Additionally I wanted to indicate that the hook can't do any legitimization
> and is really purely only for selection.  But perhaps all of this is better in
> docs. So s/preferred/target?
> 

Did you want me to rename this or just update the docs and submit Richi?

Thanks,
Tamar

> > > Thanks,
> > > Tamar
> > >
> > > gcc/ChangeLog:
> > >
> > >   * target.def (preferred_instruction_selection): New.
> > >   * doc/tm.texi.in: Document it.
> > >   * doc/tm.texi: Regenerate
> > >   * gimple-isel.cc (pass_gimple_isel::execute): Use it.
> > >   * targhooks.cc (default_preferred_instruction_selection): New.
> > >   * targhooks.h (default_preferred_instruction_selection): New.
> > >
> > > ---
> > > diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
> > > index
> >
> fd208f53844a157721dd8a0282f283da64cf5d93..35c1e2061f3bfed037a50
> > e01c8ff50c199801a1b 100644
> > > --- a/gcc/doc/tm.texi
> > > +++ b/gcc/doc/tm.texi
> > > @@ -6628,6 +6628,16 @@ like @code{cond_add@var{m}}.  The default
> > implementation returns a zero
> > >  constant of type @var{type}.
> > >  @end deftypefn
> > >
> > > +@deftypefn {Target Hook} bool
> > TARGET_PREFERRED_INSTRUCTION_SELECTION (function *@var{fun},
> > gimple_stmt_iterator *@var{gsi})
> > > +This hook allows a target to give a preferred instruction selection for 
> > > an
> > > +instruction or sequence of instructions before expand to allow expansion
> to
> > > +generate more efficient code.
> > > +
> > > +@var{fun} is the current function being considered and @var{gsi} is the
> > > +iterator pointing to the current instruction being optimized.  The 
> > > default
> > > +implementation does not do any rewriting and returns false.
> > > +@end deftypefn
> > > +
> >
> > The return value is not documented.  As with your patch it would
> > indicate whether the CFG was changed, but I think as you name it
> > "preferred" the intent is to not do any further instruction selection
> > when the target did something?
> >
> > The current pass stmt iteration is a bit messy in this regard, in
> > particular also what allowed modifications of 'gsi' are concerned
> > which looks like some handlers might remove the current stmt
> > but we advance it anyway (causing to possibly skip a stmt).
> >
> 
> Yeah I was wondering whether I need to document what the state the callees
> need to leave GSI in.  You're right in that the contract is implicit..
> 
> I'll add it.
> 
> Thanks,
> Tamar
> 
> > Apart from this documentation issue the change looks OK to me.
> >
> > Richard.
> >
> >
> > >  @deftypefn {Target Hook} tree TARGET_GOACC_ADJUST_PRIVATE_DECL
> > (location_t @var{loc}, tree @var{var}, int @var{level})
> > >  This hook, if defined, is used by accelerator target back-ends to adjust
> > >  OpenACC variable declarations that should be made private to the given
> > > diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in
> > > index
> >
> 14315dd508051037b7936c89638c05f07b6d3d6f..825599407379dadb2b1
> > 9e53f38a8af58ec3fca5b 100644
> > > --- a/gcc/doc/tm.texi.in
> > > +++ b/gcc/doc/tm.texi.in
> > > @@ -4352,6 +4352,8 @@ address;  but often a machine-dependent
> > strategy can generate better code.
> > >
> > >  @hook TARGET_PREFERRED_ELSE_VALUE
> > >
> > > +@hook TARGET_PREFERRED_INSTRUCTION_SELECTION
> > > +
> > >  @hook TARGET_GOACC_ADJUST_PRIVATE_DECL
> > >
> > >  @hook TARGET_GOACC_EXPAND_VAR_DECL
> > > diff --git a/gcc/gimple-isel.cc b/gcc/gimple-isel.cc
> > > index
> >
> e745608904e3db77a88d861bc6512afe67a82480..ac1a4c56a66b608d963f
> > 93a2ce80549016fd0f1d 100644
> > > --- a/gcc/gimple-isel.cc
> > > +++ b/gcc/gimple-isel.cc
> > > @@ -1357,6 +1357,9 @@ pass_gimple_isel::execute (struct function
> *fun)
> > >      {
> > >        for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
> > >   {
> > > +   /* Give the target first try at replacing the instruction.  */
> > > +   cfg_changed |= targetm.preferred_instruction_selection (fun, &gsi);
> > > +
> > >     /* Pre-expand VEC_COND_EXPRs to .VCOND* internal function
> > >        calls mapping to supported optabs.  */
> > >     gimple *g = gimple_expand_vec_cond_expr (&gsi);
> > > diff --git a/gcc/target.def b/gcc/target.def
> > > index
> >
> f288329ffcab81e2773c2066e60a470611f29e23..cdf95b8a8c871da18b60d
> > ec984be5bc2e8cea5a2 100644
> > > --- a/gcc/target.def
> > > +++ b/gcc/target.def
> > > @@ -2137,6 +2137,19 @@ constant of type @var{type}.",
> > >   (unsigned ifn, tree type, unsigned nops, tree *ops),
> > >   default_preferred_else_value)
> > >
> > > +DEFHOOK
> > > +(preferred_instruction_selection,
> > > + "This hook allows a target to give a preferred instruction selection for
> an\n\
> > > +instruction or sequence of instructions before expand to allow expansion
> > to\n\
> > > +generate more efficient code.\n\
> > > +\n\
> > > +@var{fun} is the current function being considered and @var{gsi} is
> the\n\
> > > +iterator pointing to the current instruction being optimized.  The
> default\n\
> > > +implementation does not do any rewriting and returns false.",
> > > + bool,
> > > + (function *fun, gimple_stmt_iterator *gsi),
> > > + default_preferred_instruction_selection)
> > > +
> > >  DEFHOOK
> > >  (record_offload_symbol,
> > >   "Used when offloaded functions are seen in the compilation unit and no
> > named\n\
> > > diff --git a/gcc/targhooks.cc b/gcc/targhooks.cc
> > > index
> >
> 1873d572ba3fb59c4713e10b5c5b14afb029b953..c906a8055cc565f7ad86
> > fba878645aa6e1b61337 100644
> > > --- a/gcc/targhooks.cc
> > > +++ b/gcc/targhooks.cc
> > > @@ -2764,6 +2764,14 @@ default_preferred_else_value (unsigned, tree
> > type, unsigned, tree *)
> > >    return build_zero_cst (type);
> > >  }
> > >
> > > +/* The default implementation of
> > TARGET_PREFERRED_INSTRUCTION_SELECTION.  */
> > > +
> > > +bool
> > > +default_preferred_instruction_selection (function *, gimple_stmt_iterator
> > *)
> > > +{
> > > +  return false;
> > > +}
> > > +
> > >  /* Default implementation of TARGET_HAVE_SPECULATION_SAFE_VALUE.
> > */
> > >  bool
> > >  default_have_speculation_safe_value (bool active ATTRIBUTE_UNUSED)
> > > diff --git a/gcc/targhooks.h b/gcc/targhooks.h
> > > index
> >
> 92e7a4cb10f109978301d8c10f69b4c5a3952f56..4bfcbdd0c3012fdd67201
> > aa5da638eb8177e945e 100644
> > > --- a/gcc/targhooks.h
> > > +++ b/gcc/targhooks.h
> > > @@ -305,7 +305,8 @@ extern machine_mode
> > default_mode_for_floating_type (enum tree_index);
> > >  extern HOST_WIDE_INT
> > default_stack_clash_protection_alloca_probe_range (void);
> > >  extern void default_select_early_remat_modes (sbitmap);
> > >  extern tree default_preferred_else_value (unsigned, tree, unsigned, tree
> *);
> > > -
> > > +extern bool default_preferred_instruction_selection (function *,
> > > +                                              gimple_stmt_iterator *);
> > >  extern bool default_have_speculation_safe_value (bool);
> > >  extern bool speculation_safe_value_not_needed (bool);
> > >  extern rtx default_speculation_safe_value (machine_mode, rtx, rtx, rtx);
> > >
> > >
> > >
> >
> > --
> > Richard Biener <[email protected]>
> > SUSE Software Solutions Germany GmbH,
> > Frankenstrasse 146, 90461 Nuernberg, Germany;
> > GF: Jochen Jaser, Andrew McDonald, Werner Knoblich; (HRB 36809, AG
> > Nuernberg)

Reply via email to