https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112634
--- Comment #3 from Tobias Burnus <burnus at gcc dot gnu.org> --- Breakpoint 6, gen_assign_counter_update (gsi=0x7fffffffcab0, call=0x7ffff7230b48, func=0x7ffff736cb00, result=0x7ffff7200b98, name=0x258f5f2 "PROF_time_profile") at ../../../repos/gcc/gcc/tree-profile.cc:247 (gdb) p debug_gimple_stmt(call) __atomic_add_fetch_8 (&__gcov_time_profiler_counter, 1, 0); (gdb) p debug_tree(result) <array_ref 0x7ffff7200b98 type <integer_type 0x7ffff7221738 long int public DI ... arg:0 <var_decl 0x7ffff73f4990 __gcov7.main._omp_fn.0 type <array_type 0x7ffff73f3690 type <integer_type 0x7ffff7221738 long int> BLK (gdb) p debug_tree(func) <function_decl 0x7ffff736cb00 __atomic_add_fetch_8 type <function_type 0x7ffff7245f18 type <integer_type 0x7ffff72217e0 long unsigned int public unsigned DI * * * The commit changed: - gcall *stmt = gimple_build_call (f, 3, addr, one, - build_int_cst (integer_type_node, - MEMMODEL_RELAXED)); - gsi_insert_on_edge (e, stmt); + tree f = builtin_decl_explicit (TYPE_PRECISION (type) > 32 + ? BUILT_IN_ATOMIC_ADD_FETCH_8: + BUILT_IN_ATOMIC_ADD_FETCH_4); + gcall *call = gimple_build_call (f, 3, addr, one, relaxed); + gen_assign_counter_update (gsi, call, f, result, name); with the new gen_assign_counter_update: + if (result) + { + tree result_type = TREE_TYPE (TREE_TYPE (func)); + tree tmp = make_temp_ssa_name (result_type, NULL, name); + gimple_set_lhs (call, tmp); + gsi_insert_after (gsi, call, GSI_NEW_STMT); + gassign *assign = gimple_build_assign (result, tmp); + gsi_insert_after (gsi, assign, GSI_NEW_STMT); * * * Thus, it looks as if f's alias func's 'result_type' is unsigned while the rest is all signed.