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

            Bug ID: 91185
           Summary: -Og miscompiles code causing runtime segfault
           Product: gcc
           Version: 7.4.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: regression
          Assignee: unassigned at gcc dot gnu.org
          Reporter: david.bolvansky at gmail dot com
  Target Milestone: ---

tVar *eval(tVar *op)
{
        if (unlikely(op == NULL))
                return NULL;

        tVar *a = op->offset + frame_stack.top->frame->local;
        switch (op->offset)
        {
        case CONSTANT:
                return op;
        default:
        {
                if (likely(a->initialized))
                        return a;
                else
                        abort();
        }
        }
}


GCC 7.4 -Og
eval(tVar*):
        test    rdi, rdi
        je      .L4
        mov     rax, QWORD PTR frame_stack[rip]
        mov     rsi, QWORD PTR [rax]
        mov     edx, DWORD PTR [rdi+16]
        movsx   rax, edx
        lea     rcx, [rax+rax*2]
        lea     rax, [0+rcx*8]
        lea     rax, [rsi+16+rax]
        cmp     edx, -1
        je      .L5
        cmp     BYTE PTR [rax], 0
        je      .L9
.L1:
        rep ret
.L9:
        sub     rsp, 8
        call    abort
.L4:
        mov     eax, 0
        ret
.L5:
        mov     rax, rdi
        jmp     .L1
frame_stack:
        .zero   16

GCC 7.4 -O1
eval(tVar*):
        test    rdi, rdi
        je      .L2
        mov     eax, DWORD PTR [rdi+16]
        cmp     eax, -1
        je      .L2
        mov     rdx, QWORD PTR frame_stack[rip]
        mov     rdx, QWORD PTR [rdx]
        cdqe
        lea     rax, [rax+rax*2]
        lea     rdi, [rdx+16+rax*8]
        cmp     BYTE PTR [rdi], 0
        je      .L7
.L2:
        mov     rax, rdi
        ret
.L7:
        sub     rsp, 8
        call    abort
frame_stack:
        .zero   16


It seems -Og places the check 
cmp     edx, -1
je      .L5

too late -> SEGFAULT


I have a segfault with GCC 7,8,9 on Intel Haswell. Looking at godbolt's output
for GCC 6.4, it is seems to be buggy too.

Godbolt: https://godbolt.org/z/m2yzDA

Reply via email to