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

            Bug ID: 94485
           Summary: [10.0.1, c++2a] g++ optimizes away the code, accepts
                    arbitrary inline asm
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: dimitri.gorokhovik at free dot fr
  Target Milestone: ---

Created attachment 48194
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=48194&action=edit
Sample code illustrating the sighting.

Version: gcc (GCC) 10.0.1 20200404 (experimental)

command line:
~/gcc-trunk/dist/bin/g++ -std=c++2a  -O3 -Wall -Wextra -W bug-202004041709.cpp
-o bug-1 && ./bug-1


The attached file (apologies, still big) contains the following code (line
425):

  constexpr iterator (tesselation const& me)
   : cube_ { me.cube_ },
     inner_ { me.as_parent ().begin () },
     tess_ {},
     outer_ { tess_ }
  {
   if (inner_)
   {
     tess_ = tesselation_of_two_cubes { cube_, *inner_ };
     asm("before:");
#if 0 // breaks only with -O3
     auto const tmp { tess_.begin () };
     asm("middle:");
     outer_ = tmp;
     ^^^^^^^^^^^^
#else // breaks with -O3, -O1, fixes with -fsanitize=undefined|null
     outer_ = { tess_.begin () };
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     asm("after:");
#endif
     inner_.next ();
     if (! outer_) throw 749;
   };
  };

(Minor remark: 'asm' statements in this constexpr method raise no brows. I
tried putting there insns that require evaluation, seems anything is silently
accepted. The same asm statements are rejected in a more simple constexpr
code.)

It seems, some optimization levels completely remove the highlighted assignment
so that 'throw 749' is executed (main() prints it then). Other passes keep the
copying code and produce expected result. This over-optimization can be fixed
by enabling certain sanitizers: undefined, null, vptr.

The asm code produced:

-- broken (compiled with -O3 or -O1):
#APP
# 425 "bug-1.cpp" 1
        before:
# 0 "" 2
#NO_APP
        movq    %r12, 216(%rsp)
#APP
# 433 "bug-1.cpp" 1
        after:
# 0 "" 2
#NO_APP

-- working (compiled with -O0 or -O1 or with -fsanitizer=null):
#APP
# 425 "bug-1.cpp" 1
        before:
# 0 "" 2
#NO_APP
        xorl    %eax, %eax
        cmpb    $0, 43(%rbx)
        movq    %r14, 64(%rsp)
        movw    %ax, 72(%rsp)
        movb    $0, 74(%rsp)
        je      .L73
        cmpb    $0, 63(%rbx)
        je      .L73
        cmpb    $0, 83(%rbx)
        sete    %al
.L68:
        movb    %al, 75(%rsp)
        movq    64(%rsp), %rax
        movdqa  64(%rsp), %xmm6
        movq    %rax, 88(%rbx)
        movl    72(%rsp), %eax
        movaps  %xmm6, 96(%rsp)
        movl    %eax, 96(%rbx)
#APP
# 433 "bug-1.cpp" 1
        after:
# 0 "" 2
#NO_APP

Reply via email to