https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70541
--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> --- (In reply to Maxim Ostapenko from comment #1) > @@ -2060,7 +2067,20 @@ maybe_instrument_call (gimple_stmt_iterator *iter) > return true; > } If the function call returns a struct, then your patch wouldn't instrument it. You need the bool instrumented = false; already above if (gimple_store_p (stmt)) and set instrumented = true; there instead of gsi_next (iter); return true; > - return false; > + bool instrumented = false; > + HOST_WIDE_INT args_num = gimple_call_num_args (stmt); > + for (int i = 0; i < args_num; ++i) > + { > + if (is_arg_deref_p (TREE_CODE (gimple_call_arg (stmt, i)))) I'm not aware of any is_arg_deref_p predicate. IMHO you should test: if (!is_gimple_reg (gimple_call_arg (stmt, i))) > + { > + instrument_derefs (iter, gimple_call_arg (stmt, i), > + gimple_location (stmt), false); > + instrumented = true; > + } > + } > + if (instrumented) > + gsi_next (iter); > + return instrumented; As for the location_t thing, the fix would be to do in instrument_derefs something like: if (location == UNKNOWN_LOCATION) location = EXPR_LOCATION (t); after the early bail outs.