https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65771
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Target|arm-linux-gnueabihf | --- Comment #7 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Happens on x86_64-linux too, started with r214899. So, at *.optimized we have: # DEBUG D#2 => b # DEBUG D#1 => a[D#2].t # DEBUG c => D#1 which is expanded as: (debug_insn 5 2 6 2 (var_location:SI D#2 (mem/c:SI (symbol_ref:SI ("b") [flags 0x82] <var_decl 0x7f8953872990 b>) [0 b+0 S4 A32])) pr65771.c:8 -1 (nil)) (debug_insn 6 5 7 2 (var_location:SI D#1 (mem/j:SI (plus:SI (ashift:SI (debug_expr:SI D#2) (const_int 3 [0x3])) (const:SI (plus:SI (symbol_ref:SI ("a") [flags 0xaa] <var_decl 0x7f8953872900 a>) (const_int 4 [0x4])))) [0 a[D#2].t+0 S4 A32])) pr65771.c:8 -1 (nil)) (debug_insn 7 6 0 2 (var_location:SI c (debug_expr:SI D#1)) pr65771.c:8 -1 (nil)) and vartracking makes: (note 15 2 14 2 (var_location c (mem/j:SI (plus:SI (ashift:SI (mem/c:SI (symbol_ref:SI ("b") [flags 0x82] <var_decl 0x7f8953872990 b>) [0 b+0 S4 A 32]) (const_int 3 [0x3])) (const:SI (plus:SI (symbol_ref:SI ("a") [flags 0xaa] <var_decl 0x7f8953872900 a>) (const_int 4 [0x4])))) [0 a[D#2].t+0 S4 A32])) NOTE_INSN_VAR_LOCATION) out of this. Var-tracking for obvious reasons can only replace the DEBUG_EXPR_DECLs when they appear in debug_expr RTL, because we track DEBUG_EXPR_DECL values at RTL as RTL expressions, rather than tree. The problem is I believe that we try to use the MEM_EXPR as a fallback and if it contains DEBUG_EXPR_DECL, dwarf2out.c is upset.