On Wed, 17 Jun 2026, Tamar Christina wrote:
> > -----Original Message-----
> > From: Richard Biener <[email protected]>
> > Sent: 10 June 2026 13:55
> > To: Tamar Christina <[email protected]>
> > Cc: [email protected]; nd <[email protected]>
> > Subject: Re: [PATCH 1/3]middle-end: introduce IFN_VARYING for temporary
> > statements [PR125597]
> >
> > On Wed, 10 Jun 2026, Tamar Christina wrote:
> >
> > > This defines a new IFN "VARYING" to indicate that the operation has no
> > current
> > > defining statement and so things like range analysis should just not
> > > report
> > > anything yet.
> > >
> > > In the vectorizer we can create new SSA variables that are only defined
> > > after
> > > vectorization is finishing. For instance the actual control statement for
> > > masked loops.
> > >
> > > However intermediate values need to be able to perform build expressions
> > using
> > > this SSA name but since GCC 16 ranger now tries to analyze these and we
> > ICE.
> > >
> > > This replaces the uses of gimple_nop in the definition with a value with a
> > more
> > > defined semantics.
> > >
> > > Bootstrapped Regtested on aarch64-none-linux-gnu,
> > > arm-none-linux-gnueabihf, x86_64-pc-linux-gnu
> > > -m32, -m64 and no issues.
> > >
> > > Ok for master?
> >
> > OK.
>
> Forgot to Ask if OK for backport to GCC-16.
OK, but please wait another week or so, just in case there's fallout.
Richard.
> Thanks,
> Tamar
> >
> > Thanks,
> > Richard.
> >
> > > Thanks,
> > > Tamar
> > >
> > > gcc/ChangeLog:
> > >
> > > PR tree-optimization/125597
> > > * internal-fn.def (VARYING): New.
> > > * doc/ifn.texi: Document it.
> > > * internal-fn.cc (expand_VARYING): New.
> > > * internal-fn.h (expand_VARYING): New.
> > > * tree-cfg.cc (verify_gimple_call): Check for leaked IFN_VARYING.
> > >
> > > ---
> > > diff --git a/gcc/doc/ifn.texi b/gcc/doc/ifn.texi
> > > index
> > 95813a264730c38e1233d4ef5f989c0bc73c9a2a..9a2c60a5768af8da8b43c
> > e6dc3343deb8673101a 100644
> > > --- a/gcc/doc/ifn.texi
> > > +++ b/gcc/doc/ifn.texi
> > > @@ -1546,5 +1546,11 @@ The @code{IFN_FLOATTOBITINT} internal
> > function is expanded by the
> > > The @code{IFN_BITINTTOFLOAT} internal function is expanded by the
> > > @code{expand_BITINTTOFLOAT} function.
> > >
> > > +@cindex @code{IFN_VARYING} internal function
> > > +@item @samp{IFN_VARYING}
> > > +Use @code{IFN_VARYING} as a temporary placeholder for a value whose
> > > +definition is still being built by the current pass. The pass that
> > > creates
> > > +it must replace it before finishing; the verifier rejects any remaining
> > > calls.
> > > +
> > > @end table
> > >
> > > diff --git a/gcc/internal-fn.cc b/gcc/internal-fn.cc
> > > index
> > 8a4622da794917b1ed494e9566482001867db570..0138c6f7ef0117f43afa
> > 5c81406a6564a425d304 100644
> > > --- a/gcc/internal-fn.cc
> > > +++ b/gcc/internal-fn.cc
> > > @@ -5686,6 +5686,13 @@ expand_MASK_CALL (internal_fn, gcall *)
> > > gcc_unreachable ();
> > > }
> > >
> > > +void
> > > +expand_VARYING (internal_fn, gcall *)
> > > +{
> > > + /* This IFN should reach expand. */
> > > + gcc_unreachable ();
> > > +}
> > > +
> > > void
> > > expand_MULBITINT (internal_fn, gcall *stmt)
> > > {
> > > diff --git a/gcc/internal-fn.def b/gcc/internal-fn.def
> > > index
> > a9fb933021f8b590b7894fcb159faabf6ab55767..af9f92950c73dd09356a62
> > 5cf2fd60a5abbde321 100644
> > > --- a/gcc/internal-fn.def
> > > +++ b/gcc/internal-fn.def
> > > @@ -622,6 +622,10 @@ DEF_INTERNAL_FN (CO_FRAME, ECF_PURE |
> > ECF_NOTHROW | ECF_LEAF, NULL)
> > > /* A NOP function with arbitrary arguments and return value. */
> > > DEF_INTERNAL_FN (NOP, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL)
> > >
> > > +/* A GIMPLE value with no definition and not Virtual Opeands for
> > temporary
> > > + assignment cases within a pass. */
> > > +DEF_INTERNAL_FN (VARYING , ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW,
> > NULL)
> > > +
> > > /* Temporary vehicle for __builtin_shufflevector. */
> > > DEF_INTERNAL_FN (SHUFFLEVECTOR, ECF_CONST | ECF_LEAF |
> > ECF_NOTHROW, NULL)
> > >
> > > diff --git a/gcc/internal-fn.h b/gcc/internal-fn.h
> > > index
> > bd9ba8d6929af57bdcd7706feaa8ad5229532973..30930f388b069ca98167
> > f0911c62681143979327 100644
> > > --- a/gcc/internal-fn.h
> > > +++ b/gcc/internal-fn.h
> > > @@ -275,6 +275,7 @@ extern void expand_SPACESHIP (internal_fn, gcall
> > *);
> > > extern void expand_TRAP (internal_fn, gcall *);
> > > extern void expand_ASSUME (internal_fn, gcall *);
> > > extern void expand_MASK_CALL (internal_fn, gcall *);
> > > +extern void expand_VARYING (internal_fn, gcall *);
> > > extern void expand_MULBITINT (internal_fn, gcall *);
> > > extern void expand_DIVMODBITINT (internal_fn, gcall *);
> > > extern void expand_FLOATTOBITINT (internal_fn, gcall *);
> > > diff --git a/gcc/tree-cfg.cc b/gcc/tree-cfg.cc
> > > index
> > 8fb80b8121ed1fe2bb3f26844018e3d77dfd7f90..dc07dde8cfd4cfa48ea52e
> > 28e96717fb5b7958ab 100644
> > > --- a/gcc/tree-cfg.cc
> > > +++ b/gcc/tree-cfg.cc
> > > @@ -3419,6 +3419,14 @@ verify_gimple_call (gcall *stmt)
> > > }
> > > }
> > >
> > > + /* IFN_VARING is not allowed to be present after the completion of any
> > pass
> > > + as it should have been replaced. */
> > > + if (gimple_call_internal_p (stmt, IFN_VARYING))
> > > + {
> > > + error ("%<.VARYING%> calls should have been replaced and are not
> > allowed "
> > > + "outside of the pass that introduced them");
> > > + return true;
> > > + }
> > > /* ??? The C frontend passes unpromoted arguments in case it
> > > didn't see a function declaration before the call. So for now
> > > leave the call arguments mostly unverified. Once we gimplify
> > >
> > >
> > >
> >
> > --
> > 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)
>
--
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)