https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103562
David Malcolm <dmalcolm at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |ASSIGNED --- Comment #5 from David Malcolm <dmalcolm at gcc dot gnu.org> --- Thanks for filing this bug, and for the investigation. After a couple of hours debugging, I think I've found the discrepancy between cc1 and libgccjit, and have a candidate fix. When tree-inline.c:remap_gimple_stmt is called to remap the stmt: <retval> = *ptr_2(D); cc1 returns: D.1989 = *ptr_2(D); whereas libgccjit returns this (copy): <retval> = *ptr_2(D); Putting a breakpoint on remap_gimple_op_r and singlestepping (in both cc1 and libgccjit, side by side) shows the discrepancy happens in tree-inline.c:remap_gimple_op_r here: 1036 else if (auto_var_in_fn_p (*tp, fn)) For cc1: (gdb) p auto_var_in_fn_p (*tp, fn) $28 = true whereas for libgccjit: (gdb) p auto_var_in_fn_p (*tp, fn) $19 = false and so libgccjit erroneously skips the remapping of locals vars and labels. This turns out to be because the RESULT_DECL has a non-NULL DECL_CONTEXT in cc1, set here by the C frontend: (gdb) bt #0 finish_function (end_loc=248384) at ../../src/gcc/c/c-decl.c:10271 #1 0x00000000009db5f7 in c_parser_declaration_or_fndef (parser=0x7ffff7ffbbd0, fndef_ok=true, static_assert_ok=true, empty_ok=true, nested=false, start_attr_ok=true, objc_foreach_object_declaration=0x0, omp_declare_simd_clauses=0x0, have_attrs=false, attrs=<tree 0x0>, oacc_routine_data=0x0, fallthru_attr_p=0x0) at ../../src/gcc/c/c-parser.c:2563 #2 0x00000000009d9925 in c_parser_external_declaration (parser=0x7ffff7ffbbd0) at ../../src/gcc/c/c-parser.c:1779 #3 0x00000000009d941d in c_parser_translation_unit (parser=0x7ffff7ffbbd0) at ../../src/gcc/c/c-parser.c:1652 #4 0x0000000000a21267 in c_parse_file () at ../../src/gcc/c/c-parser.c:23280 #5 0x0000000000abd0ab in c_common_parse_file () at ../../src/gcc/c-family/c-opts.c:1238 #6 0x00000000010cab1a in compile_file () at ../../src/gcc/toplev.c:452 #7 0x000000000093eb7a in do_compile (no_backend=false) at ../../src/gcc/toplev.c:2156 #8 toplev::main (this=0x7fffffffde1a, argc=<optimized out>, argv=<optimized out>) at ../../src/gcc/toplev.c:2308 #9 0x000000000270339d in main (argc=24, argv=0x7fffffffdf28) at ../../src/gcc/main.c:39 (gdb) list 10266 /* Must mark the RESULT_DECL as being in this function. */ 10267 10268 if (DECL_RESULT (fndecl) && DECL_RESULT (fndecl) != error_mark_node) 10269 DECL_CONTEXT (DECL_RESULT (fndecl)) = fndecl; whereas the RESULT_DECL has NULL for its DECL_CONTEXT. On trying this patch: --- a/gcc/jit/jit-playback.c +++ b/gcc/jit/jit-playback.c @@ -473,6 +473,7 @@ new_function (location *loc, DECL_ARTIFICIAL (resdecl) = 1; DECL_IGNORED_P (resdecl) = 1; DECL_RESULT (fndecl) = resdecl; + DECL_CONTEXT (resdecl) = fndecl; if (builtin_id) { then remap_gimple_stmt in libgccjit correctly remaps the stmt to: (gdb) call debug ($21) D.88 = *ptr_2(D); and I correctly get this output from the libgccjit testcase: get_a(&s) is 1 i.e. the above patch seems to fix it. I'm running some more thorough tests.