public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "pinskia at gcc dot gnu.org" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug target/109903] Register misallocation in hand-crafted asm insn, no diagnostics produced
Date: Thu, 18 May 2023 15:50:06 +0000	[thread overview]
Message-ID: <bug-109903-4-UQ5jnQU5hz@http.gcc.gnu.org/bugzilla/> (raw)
In-Reply-To: <bug-109903-4@http.gcc.gnu.org/bugzilla/>

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109903

--- Comment #5 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
(In reply to Dimitri Gorokhovik from comment #4)
> Hi Andrew,
> 
> I'd agree more with "WONTFIX" here ;-) We are not looking for solution. We
> want to spare the same hassle to others.

Why you didn't read the documentation which is documents inline-asm. And there
is no way for GCC to know what you mean.

> 
> This asm doesn't write to memory, it doesn't even read any -- 'a' is passed
> over in the registers with aarch64 and x64_86.

Oh I read the instruction wrong.
> 
> It is also very hard to see the need for early clobber here ... how comes
> the version with return value doesn't need it while the other does? The asm
> performs regular register loads. Certainly we are not marking all register
> loads with early clobbers are we?

The easy and fast rule is simple. If you write to an output operand before read
from an input operand, that output operand needs an early clobber. This is how
I knew what the issue was right away without even looking further into what was
going wrong.

Even the documentation is clear here:
"Means (in a particular alternative) that this operand is an earlyclobber
operand, which is written before the instruction is finished using the input
operands."

The reason why sometimes it works sometimes it does not work is depedent on the
register allocator. In the case of return and first argument registers, well
usually those are the same register so the register allocator wants to
minimalize the number of spills and/or register moves.

> 
> WE ended up moving 'a' to output clause, it feels barely more contorted than
> the early-clobber method.

That is actually WRONG and will produce wrong code in some cases. The early
clobber is the right appoarch here if you are writing to an operand before you
use all of the input operands (again this is all DOCUMENTED and has been for
the over 10 years now).

> 
> > GCC does not look at the inline-asm template except while outputting the assembly.
> Yep, reason why I let it emit ARMv8 insns for the x64_86 target ;-)

  parent reply	other threads:[~2023-05-18 15:50 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-05-18 14:59 [Bug target/109903] New: " dimitri.gorokhovik at free dot fr
2023-05-18 15:02 ` [Bug target/109903] " pinskia at gcc dot gnu.org
2023-05-18 15:04 ` pinskia at gcc dot gnu.org
2023-05-18 15:05 ` pinskia at gcc dot gnu.org
2023-05-18 15:28 ` dimitri.gorokhovik at free dot fr
2023-05-18 15:50 ` pinskia at gcc dot gnu.org [this message]
2023-05-18 16:09 ` dimitri.gorokhovik at free dot fr

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bug-109903-4-UQ5jnQU5hz@http.gcc.gnu.org/bugzilla/ \
    --to=gcc-bugzilla@gcc.gnu.org \
    --cc=gcc-bugs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).