On Wed, 12 Mar 2025, Tejas Belagod wrote: > On 3/10/25 7:21 PM, Richard Biener wrote: > > On Sat, 8 Mar 2025, Tejas Belagod wrote: > > > >> On 3/8/25 12:55 AM, Tejas Belagod wrote: > >>> On 3/7/25 5:34 PM, Richard Biener wrote: > >>>> On Fri, 7 Mar 2025, Tejas Belagod wrote: > >>>> > >>>>> On 3/7/25 4:38 PM, Richard Biener wrote: > >>>>>> On Fri, 7 Mar 2025, Tejas Belagod wrote: > >>>>>> > >>>>>>> Given a vector mode and its corresponding element mode, this new new > >>>>>>> language > >>>>>>> hook returns a vector type that has properties of the vector mode and > >>>>>>> element > >>>>>>> type of that of the element mode. For eg. on AArch64, given VNx16BI > >>>>>>> and > >>>>>>> QImode > >>>>>>> it returns VNx16QI i.e. the wider mode to BImode that is an SVE mode. > >>>>>> > >>>>>> What's the rationale for this to be a new frontend hook? It seems > >>>>>> to be a composition of a target hook (related_mode) and a > >>>>>> frontend hook (type_for_mode). > >>>>> > >>>>> I don't know this part of the FE very well, so pardon if its wrong way > >>>>> to > >>>>> do > >>>>> it. > >>>>> > >>>>> I was trying to find a generic way to determine a wider vtype for a > >>>>> given > >>>>> vmode in a language-agnostic way. It looks like lang hooks are the > >>>>> generic > >>>>> way > >>>>> for the mid-end to communicate to the FE to determine types the FE seems > >>>>> fit, > >>>>> so I decided to make it a langhook. > >>>> > >>>> Who is supposed to call this hook and for what reason? Why would the > >>>> frontend be involved here? > >>>> > >>> > >>> Ah, sorry, I should've mentioned. This hook is called in Patch 4/6 during > >>> gimplification (gimplify_compound_lval) that implements the subscript > >>> operator for svbool_t - this hook returns a 'container' type for an n-bit > >>> boolean type which in this case is a byte vector for the 1- bit svbool_t > >>> vector. I involve the FE here in the same principle as for eg. > >>> TYPE_FOR_SIZE > >>> as the FE is best-placed to return the right 'container' type as defined > >>> by > >>> the language. The type returned by the FE is used to unpack svbool_t to > >>> its > >>> container vector type to implement the subscript operator. > >>> > >>>>> And how can it survive without > >>>>>> a default implementation? > >>>>>> > >>>>> > >>>>> I saw a comment in langhooks-def.h that says: > >>>>> > >>>>> /* Types hooks. There are no reasonable defaults for most of them, > >>>>> so we create a compile-time error instead. */ > >>>>> > >>>>> So I assumed it was OK to have a NULL default which presumably fails at > >>>>> build > >>>>> time when a hook is not defined for a language. Is there a more graceful > >>>>> way > >>>>> to remedy this? > >>>> > >>>> Well, you made the default a NULL pointer - what do you do at the use > >>>> point of the hook when it's not defined? > >>>> > >>> > >>> True. I saw some of the other type hooks had NULL, so AIUI, I imagined it > >>> could be NULL and it would crash when used for a FE that didn't implement > >>> it. I admit I'm not even sure if this is the right way to do this. > >>> > >>> So, before I embarked on a 'default' implementation (which I'm not fully > >>> sure how to do) my main intention was to clarify (via this RFC) if the > >>> langhook approach was indeed the best way for gimple to obtain the related > >>> vtype it needed for the vbool type it was unpacking to do the subscript > >>> operation on? > >>> > >> > >> Thinking about this a bit more, I realize my mistake - I've made this a > >> langhook only for the purpose of gimplify to communicate to the FE to call > >> c_common_related_vtype_for_mode (). I think I need to go back to the > >> drawing > >> board on this one - I'm not so convinced now that this is actually serving > >> a > >> new langhook need. > >> > >> If this new 'hook' is just a wrapper for targetm.vectorize.related_mode () > >> and > >> type_for_mode () I can probably just call them directly during gimplify or > >> c-common.cc instead of inventing this new hook. > > > > That was my thinking. The alternative is to (pre-)gimplify this either > > during genericization or in the already existing gimplify_expr > > langhook. Or perform the "decay" as part of GENERIC building. > > > > When I tried to decay svbool to char[] during genericization, it is quite > straighforward for svbool[] reads, but for writes I need to introduce a > temporary (because VEC_CONVERT IFN can't be an lvalue) and I don't know if > Generic is too early to allow for introducing temporaries.
You might be doing the lvalues wrong then? For _Bool b = int the frontend converts the int to _Bool, it doesn't decay _Bool to a int "lvalue". So I'd expect the frontend, for svbool b = x to have the 'x' possibly decayed as char[] and a conversion via VEC_CONVERT inserted? > If I leave the decay too late till gimplification of the base expression of > svbool happens in gimplify_compound_lval (), it becomes a bit tedious to > rewrite parent nodes while walking back up the tree from the base expression - > hence the hybrid approach to decay. > > Do you think leaving the tree in a partially rewritten state until > gimplification can cause consistency checks to fail? > > Thanks, > Tejas. > > > Richard. > > > >> Thanks for your reviews - I think I might be able to drop this patch and > >> merge > >> the necessary parts into later ones in the series! > >> > >> Thanks, > >> Tejas. > >> > >> > > > > > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)