Skip to content

Wrong mapping assembly-line at Og #50850

@FiorellaArtuso

Description

@FiorellaArtuso
Bugzilla Link 51508
Version trunk
OS Linux
CC @JDevlieghere,@jmorse,@walkerkd,@pogo59

Extended Description

Comment:
The increment of variable g_64 at line 6 is assigned to wrong assembly instructions.

Steps to reproduce bug:

root@14f37d90482b:/home/stepping/output# clang -v
clang version 14.0.0 (https://github.com/llvm/llvm-project.git 9573343)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/local/bin
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/7
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/7.5.0
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/8
Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/7.5.0
Candidate multilib: .;@m64
Selected multilib: .;@m64

root@14f37d90482b:/home/stepping/output# lldb -v
lldb version 14.0.0 (https://github.com/llvm/llvm-project.git revision 9573343)
clang revision 9573343
llvm revision 9573343

root@9ac1f462aecb:/home/stepping/output# cat a.c
static char b = -1;
int g_64, c;
volatile int d;
char(a)(e, f) { return e - f; }
void func_42() {
++g_64;
c = 0;
for (; c != 3; c = a(c, 1))
d = 9 | b;
b = 0;
}
int main() { func_42(); }

root@9ac1f462aecb:/home/stepping/output# cat -n a.c
1 static char b = -1;
2 int g_64, c;
3 volatile int d;
4 char(a)(e, f) { return e - f; }
5 void func_42() {
6 ++g_64;
7 c = 0;
8 for (; c != 3; c = a(c, 1))
9 d = 9 | b;
10 b = 0;
11 }
12 int main() { func_42(); }

root@9ac1f462aecb:/home/stepping/output# clang -Og -g -Wno-everything -o opt a.c

root@9ac1f462aecb:/home/stepping/output# lldb opt
(lldb) target create "opt"
Current executable set to '/home/stepping/output/opt' (x86_64).
(lldb) b 6
Breakpoint 1: 2 locations.
(lldb) r
Process 36 launched: '/home/stepping/output/opt' (x86_64)
Process 36 stopped

  • thread #​1, name = 'opt', stop reason = breakpoint 1.2
    frame #​0: 0x00000000004004f0 optmain [inlined] func_42 at a.c:6:3 3 volatile int d; 4 char(a)(e, f) { return e - f; } 5 void func_42() { -> 6 ++g_64; 7 c = 0; 8 for (; c != 3; c = a(c, 1)) 9 d = 9 | b; (lldb) di -l optmain:
    -> 0x4004f0 <+0>: addl $0x1, 0x200b35(%rip) ; opt.PT_LOAD[1]..bss + 3
    0x4004f7 <+7>: cmpb $0x0, 0x200b36(%rip) ; c + 3
    0x4004fe <+14>: movl $0x9, %ecx
    0x400503 <+19>: movl $0xffffffff, %eax ; imm = 0xFFFFFFFF
    0x400508 <+24>: cmovnel %ecx, %eax
    (lldb) si
    Process 36 stopped
  • thread #​1, name = 'opt', stop reason = instruction step into
    frame #​0: 0x00000000004004f7 optmain [inlined] func_42 at a.c:6:3 3 volatile int d; 4 char(a)(e, f) { return e - f; } 5 void func_42() { -> 6 ++g_64; 7 c = 0; 8 for (; c != 3; c = a(c, 1)) 9 d = 9 | b; (lldb) di -l optmain:
    0x4004f0 <+0>: addl $0x1, 0x200b35(%rip) ; opt.PT_LOAD[1]..bss + 3
    -> 0x4004f7 <+7>: cmpb $0x0, 0x200b36(%rip) ; c + 3
    0x4004fe <+14>: movl $0x9, %ecx
    0x400503 <+19>: movl $0xffffffff, %eax ; imm = 0xFFFFFFFF
    0x400508 <+24>: cmovnel %ecx, %eax
    (lldb) si
    Process 36 stopped
  • thread #​1, name = 'opt', stop reason = instruction step into
    frame #​0: 0x00000000004004fe optmain [inlined] func_42 at a.c:6:3 3 volatile int d; 4 char(a)(e, f) { return e - f; } 5 void func_42() { -> 6 ++g_64; 7 c = 0; 8 for (; c != 3; c = a(c, 1)) 9 d = 9 | b; (lldb) di -l optmain:
    0x4004f0 <+0>: addl $0x1, 0x200b35(%rip) ; opt.PT_LOAD[1]..bss + 3
    0x4004f7 <+7>: cmpb $0x0, 0x200b36(%rip) ; c + 3
    -> 0x4004fe <+14>: movl $0x9, %ecx
    0x400503 <+19>: movl $0xffffffff, %eax ; imm = 0xFFFFFFFF
    0x400508 <+24>: cmovnel %ecx, %eax
    (lldb) si
    Process 36 stopped
  • thread #​1, name = 'opt', stop reason = instruction step into
    frame #​0: 0x0000000000400503 optmain [inlined] func_42 at a.c:6:3 3 volatile int d; 4 char(a)(e, f) { return e - f; } 5 void func_42() { -> 6 ++g_64; 7 c = 0; 8 for (; c != 3; c = a(c, 1)) 9 d = 9 | b; (lldb) di -l optmain:
    0x4004f0 <+0>: addl $0x1, 0x200b35(%rip) ; opt.PT_LOAD[1]..bss + 3
    0x4004f7 <+7>: cmpb $0x0, 0x200b36(%rip) ; c + 3
    0x4004fe <+14>: movl $0x9, %ecx
    -> 0x400503 <+19>: movl $0xffffffff, %eax ; imm = 0xFFFFFFFF
    0x400508 <+24>: cmovnel %ecx, %eax
    (lldb) si
    Process 36 stopped
  • thread #​1, name = 'opt', stop reason = instruction step into
    frame #​0: 0x0000000000400508 optmain [inlined] func_42 at a.c:6:3 3 volatile int d; 4 char(a)(e, f) { return e - f; } 5 void func_42() { -> 6 ++g_64; 7 c = 0; 8 for (; c != 3; c = a(c, 1)) 9 d = 9 | b; (lldb) di -l optmain:
    0x4004f0 <+0>: addl $0x1, 0x200b35(%rip) ; opt.PT_LOAD[1]..bss + 3
    0x4004f7 <+7>: cmpb $0x0, 0x200b36(%rip) ; c + 3
    0x4004fe <+14>: movl $0x9, %ecx
    0x400503 <+19>: movl $0xffffffff, %eax ; imm = 0xFFFFFFFF
    -> 0x400508 <+24>: cmovnel %ecx, %eax

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugzillaIssues migrated from bugzilladebuginfoinvalidResolved as invalid, i.e. not a bug

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions