public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug rtl-optimization/102150] New: Speculative execution of inline assembly causes divide error
@ 2021-09-01  0:56 jeremy-gcc-bugzilla at sawicki dot us
  2021-09-01  8:41 ` [Bug inline-asm/102150] " rguenth at gcc dot gnu.org
  0 siblings, 1 reply; 2+ messages in thread
From: jeremy-gcc-bugzilla at sawicki dot us @ 2021-09-01  0:56 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 102150
           Summary: Speculative execution of inline assembly causes divide
                    error
           Product: gcc
           Version: 11.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jeremy-gcc-bugzilla at sawicki dot us
  Target Milestone: ---

Created attachment 51391
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=51391&action=edit
Reproducible test case

The attached test case uses inline assembly to wrap the x86_64 DIV instruction.
 GCC speculatively executes the inline assembly on inputs that the source
program does not, resulting in a divide error.

The GCC documentation says that non-volatile inline assembly may be discarded
or moved out of loops.  It is not obvious whether speculative execution is also
permitted.  I asked on gcc-help and was asked to file a report.

A related report points out that many projects currently wrap the DIV
instruction without using volatile:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82677

Another related report considers the similar issue of whether pure/const
functions must be non-trapping for inputs they don't actually receive:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93491

If it is determined that volatile is required, it would helpful to clarify in
the documentation that speculative execution may occur without volatile:
https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#Volatile

gcc version 11.2.0 (GCC)
Target: x86_64-pc-linux-gnu
Configured with: /home/jeremys/gcc-11.2.0/configure
--prefix=/home/jeremys/gcc-11.2.0-install --disable-multilib

Command line: g++ -O3 -o divasm divasm.cpp
No compiler errors/warnings are produced
When executed, a divide error occurs

^ permalink raw reply	[flat|nested] 2+ messages in thread

* [Bug inline-asm/102150] Speculative execution of inline assembly causes divide error
  2021-09-01  0:56 [Bug rtl-optimization/102150] New: Speculative execution of inline assembly causes divide error jeremy-gcc-bugzilla at sawicki dot us
@ 2021-09-01  8:41 ` rguenth at gcc dot gnu.org
  0 siblings, 0 replies; 2+ messages in thread
From: rguenth at gcc dot gnu.org @ 2021-09-01  8:41 UTC (permalink / raw)
  To: gcc-bugs

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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |rguenth at gcc dot gnu.org

--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
We have

bool
gimple_could_trap_p_1 (const gimple *s, bool include_mem, bool include_stores)
{
...
    case GIMPLE_ASM:
      return gimple_asm_volatile_p (as_a <const gasm *> (s));

so we consider ASMs not trapping unless they are volatile.  Note we do
check the asm operands for possible traps, for example if memory inputs
or outputs are a possible source of traps that doesn't need the ASM to be
marked volatile.

And yes, we'd require the ASM to be not trapping even when not executed
on the actual input.

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2021-09-01  8:41 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-01  0:56 [Bug rtl-optimization/102150] New: Speculative execution of inline assembly causes divide error jeremy-gcc-bugzilla at sawicki dot us
2021-09-01  8:41 ` [Bug inline-asm/102150] " rguenth at gcc dot gnu.org

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).