https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91611
--- Comment #2 from Tom de Vries <vries at gcc dot gnu.org> --- Also, consider test2.c (as test2.c in PR91610, but with register keyword for variable l in wack_signed_char): ... #include <stdio.h> signed char add_signed_char (signed char u, signed char v) { return u + v; } signed char wack_signed_char (signed char u, signed char v) { register signed char l = u, r = v; l = add_signed_char (l, r); return l + r; } int main () { signed char res = wack_signed_char (-1, -2); printf ("%d\n", res); return 0; } ... With Og: ... $ gcc test2.c -g -Og ... we have the expected l == 2 result: ... $ gdb -q a.out -ex "b test2.c:13" -ex run Reading symbols from a.out...done. Breakpoint 1 at 0x400527: file test2.c, line 13. Starting program: /data/gdb_versions/devel/a.out Breakpoint 1, wack_signed_char (u=u@entry=-1 '\377', v=v@entry=-2 '\376') at test2.c:13 13 l = add_signed_char (l, r); (gdb) p l $1 = -1 '\377' (gdb) p r $2 = -2 '\376' (gdb) set variable l = 4 (gdb) p l $3 = 4 '\004' (gdb) n 14 return l + r; (gdb) p l $4 = 2 '\002' ... However, when we use -O0 plus all the debug flags that are enabled at > O0 according to the docs: ... $gcc test2.c -g -O0 -fvar-tracking -fvar-tracking-assignments -gstatement-frontiers ... we get: ... $ gdb -q a.out -ex "b test2.c:13" -ex run Reading symbols from a.out...done. Breakpoint 1 at 0x400558: file test2.c, line 13. Starting program: /data/gdb_versions/devel/a.out Breakpoint 1, wack_signed_char (u=u@entry=-1 '\377', v=v@entry=-2 '\376') at test2.c:13 13 l = add_signed_char (l, r); (gdb) p l $1 = -1 '\377' (gdb) p r $2 = -2 '\376' (gdb) set variable l = 4 (gdb) p l $3 = 4 '\004' (gdb) n 14 return l + r; (gdb) p l $4 = -3 '\375' ...