On Sat, Jun 21, 2025 at 09:18:43AM -0600, Jeff Law wrote:
>
>
> On 5/20/25 1:22 AM, Stefan Schulze Frielinghaus wrote:
> > This implements error handling for hard register constraints including
> > potential conflicts with register asm operands.
> >
> > In contrast to register asm operands, hard register constraints allow
> > more than just one register per operand. Even more than just one
> > register per alternative. For example, a valid constraint for an
> > operand is "{r0}{r1}m,{r2}". However, this also means that we have to
> > make sure that each register is used at most once in each alternative
> > over all outputs and likewise over all inputs. For asm statements this
> > is done by this patch during gimplification. For hard register
> > constraints used in machine description, error handling is still a todo
> > and I haven't investigated this so far and consider this rather a low
> > priority.
> >
> > There are 9/10 call sides for parse_{input,output}_constraint() which I
> > didn't dare to touch in the first run. If this patch is about to be
> > accepted I could change those call sides and explicitly pass a null
> > pointer instead of overloading those functions as it is done right now.
> > I consider this an implementation nit and didn't want to clutter the
> > patch for reviewing.
> Makes sense. I tend to prefer the overloads when we can easily do so, so
> please make that change. You're going to need a ChangeLog as well.
>
>
> With those changes this is OK as well.
Just to get this right, you prefer the overloads which means I leave the
patch as is, right?
As promised in the cover letter I will also look into the last failing
test. What is a bit annoying, now, that some errors are thrown during
gimplification and some during expand. For example, from pr87600-3.c
test1 fails during expand_asm_stmt() and test{2,3} fail during
parse_input_constraint(). Since after throwing an error during
gimplification we do not reach expand anymore and the dg-warnings for
those fail. Currently I see two ways to fix this. Simply split the
test into two files, or move the error handling part from expand to
gimplification. For the moment I went with the former since that can be
quickly done ;-) and also without my patches some errors are thrown
during gimplification and some during expand, i.e., this kind of problem
already exists. Thus, I don't have a strong opinion here but wanted to
make it clear upfront.
Since the general idea has been approved now, I will do a
bootstrap+regtest on multiple targets and probably also try to build
glibc+kernel with -fdemote-register-asm (I used that in the very
beginning as a benchmark in order to catch odd cases but didn't run
those tests for a while). I will come up with a (hopefully) last patch
series including changelogs. This manual testing might take some time.
Cheers,
Stefan