diff mbox series

[2/9,SFN] boilerplate changes in preparation to introduce nonbind markers

Message ID 20170930090827.6604-2-aoliva@redhat.com
State New
Headers show
Series [1/9,SFN] adjust RTL insn-walking API | expand

Commit Message

Alexandre Oliva Sept. 30, 2017, 9:08 a.m. UTC
This patch introduces a number of new macros and functions that will
be used to distinguish between different kinds of debug stmts, insns
and notes, namely, preexisting debug bind ones and to-be-introduced
nonbind markers.

In a seemingly mechanical way, it adjusts several uses of the macros
and functions, so that they refer to narrower categories when
appropriate.

These changes, by themselves, should not have any visible effect in
the compiler behavior, since the upcoming debug markers are never
created with this patch alone.

for  gcc/ChangeLog

	* gimple.h (enum gimple_debug_subcode): Add
	GIMPLE_DEBUG_BEGIN_STMT.
	(gimple_debug_begin_stmt_p): New.
	(gimple_debug_nonbind_marker_p): New.
	* tree.h (MAY_HAVE_DEBUG_MARKER_STMTS): New.
	(MAY_HAVE_DEBUG_BIND_STMTS): Renamed from....
	(MAY_HAVE_DEBUG_STMTS): ... this.  Check both.
	* insn-notes.def (BEGIN_STMT): New.
	* rtl.h (MAY_HAVE_DEBUG_MARKER_INSNS): New.
	(MAY_HAVE_DEBUG_BIND_INSNS): Renamed from....
	(MAY_HAVE_DEBUG_INSNS): ... this.  Check both.
	(NOTE_MARKER_LOCATION, NOTE_MARKER_P): New.
	(DEBUG_BIND_INSN_P, DEBUG_MARKER_INSN_P): New.
	(INSN_DEBUG_MARKER_KIND): New.
	(INSN_VAR_LOCATION): Check for VAR_LOCATION.
	(INSN_VAR_LOCATION_PTR): New.
	* cfgexpand.c (expand_debug_locations): Handle debug bind insns
	only.
	(expand_gimple_basic_block): Likewise.  Emit debug temps for TER
	deps only if debug bind insns are enabled.
	(pass_expand::execute): Avoid deep TER and expand
	debug locations for debug bind insns only.
	* cgraph.c (cgraph_edge::redirect_call_stmt_to_callee): Narrow
	debug stmts special handling down to debug bind stmts.
	* combine.c (try_combine): Narrow debug insns special handling
	down to debug bind insns.
	* cse.c (delete_trivially_dead_insns): Handle debug bindings.
	Narrow debug insns preexisting special handling down to debug
	bind insns.
	* dce.c (rest_of_handle_ud_dce): Narrow debug insns special
	handling down to debug bind insns.
	* function.c (instantiate_virtual_regs): Skip debug markers,
	adjust handling of debug binds.
	* gimple-ssa-backprop.c (backprop::prepare_change): Try debug
	temp insertion iff MAY_HAVE_DEBUG_BIND_STMTS.
	* haifa-sched.c (schedule_insn): Narrow special handling of debug
	insns to debug bind insns.
	* ipa-prop.c (ipa_modify_call_arguments): Narrow special
	handling of debug insns to debug bind insns.
	* ipa-split.c (split_function): Likewise.
	* ira.c (combine_and_move_insns): Adjust debug bind insns only.
	* loop-unroll.c (apply_opt_in_copies): Adjust tests on bind
	debug insns.
	* reg-stack.c (convert_regs_1): Use DEBUG_BIND_INSN_P.
	* regrename.c (build_def_use): Likewise.
	* regcprop.c (copyprop_hardreg_forward_1): Likewise.
	(pass_cprop_hardreg): Narrow special casing of debug insns to
	debug bind insns.
	* regstat.c (regstat_init_n_sets_and_refs): Likewise.
	* reload1.c (reload): Likewise.
	* sese.c (sese_build_liveouts): Narrow special casing of debug
	stmts to debug bind stmts.
	* shrink-wrap.c (move_insn_for_shrink_wrap): Likewise.
	* ssa-iterators.h (num_imm_uses): Likewise.
	* tree-cfg.c (gimple_merge_blocks): Narrow special casing of
	debug stmts to debug bind stmts.
	* tree-inline.c	(tree_function_versioning): Narrow special casing
	of debug stmts to debug bind stmts.
	* tree-loop-distribution.c (generate_loops_for_partition):
	Narrow special casing of debug stmts to debug bind stmts.
	* tree-sra.c (analyze_access_subtree): Narrow special casing
	of debug stmts to debug bind stmts.
	* tree-ssa-dce.c (remove_dead_stmt): Narrow special casing of debug
	stmts to debug bind stmts.
	* tree-ssa-loop-ivopt.c (remove_unused_ivs): Narrow special
	casing of debug stmts to debug bind stmts.
	* tree-ssa-reassoc.c (reassoc_remove_stmt): Likewise.
	* tree-ssa-tail-merge.c (tail_merge_optimize): Narrow special
	casing of debug stmts to debug bind stmts.
	* tree-ssa-threadedge.c (propagate_threaded_block_debug_info):
	Likewise.
	* tree-ssa.c (flush_pending_stmts): Narrow special casing of
	debug stmts to debug bind stmts.
	(gimple_replace_ssa_lhs): Likewise.
	(insert_debug_temp_for_var_def): Likewise.
	(insert_debug_temps_for_defs): Likewise.
	(reset_debug_uses): Likewise.
	* tree-ssanames.c (release_ssa_name_fn): Likewise.
	* tree-vect-loop-manip.c (adjust_debug_stmts_now): Likewise.
	(adjust_debug_stmts): Likewise.
	(adjust_phi_and_debug_stmts): Likewise.
	(vect_do_peeling): Likewise.
	* tree-vect-loop.c (vect_transform_loop): Likewise.
	* valtrack.c (propagate_for_debug): Use BIND_DEBUG_INSN_P.
	* var-tracking.c (adjust_mems): Narrow special casing of debug
	insns to debug bind insns.
	(dv_onepart_p, dataflow_set_clar_at_call, use_type): Likewise.
	(compute_bb_dataflow, vt_find_locations): Likewise.
	(vt_expand_loc, emit_notes_for_changes): Likewise.
	(vt_init_cfa_base): Likewise.
	(vt_emit_notes): Likewise.
	(vt_initialize): Likewise.
	(vt_finalize): Likewise.
---
 gcc/cfgexpand.c              |  8 +++----
 gcc/cgraph.c                 |  2 +-
 gcc/combine.c                | 12 +++++------
 gcc/cse.c                    | 17 ++++++++-------
 gcc/dce.c                    |  2 +-
 gcc/function.c               |  7 ++++---
 gcc/gimple-ssa-backprop.c    |  2 +-
 gcc/gimple.h                 | 31 ++++++++++++++++++++++-----
 gcc/haifa-sched.c            |  4 ++--
 gcc/insn-notes.def           |  3 +++
 gcc/ipa-prop.c               |  2 +-
 gcc/ipa-split.c              | 11 +++++-----
 gcc/ira.c                    |  4 ++--
 gcc/loop-unroll.c            |  6 ++++--
 gcc/reg-stack.c              |  4 ++--
 gcc/regcprop.c               |  4 ++--
 gcc/regrename.c              |  2 +-
 gcc/regstat.c                |  2 +-
 gcc/reload1.c                |  4 ++--
 gcc/rtl.h                    | 40 +++++++++++++++++++++++++++++++++--
 gcc/sese.c                   |  2 +-
 gcc/shrink-wrap.c            |  4 ++--
 gcc/ssa-iterators.h          |  2 +-
 gcc/tree-cfg.c               |  2 +-
 gcc/tree-inline.c            |  4 ++--
 gcc/tree-loop-distribution.c |  2 +-
 gcc/tree-sra.c               |  2 +-
 gcc/tree-ssa-dce.c           |  2 +-
 gcc/tree-ssa-loop-ivopts.c   |  2 +-
 gcc/tree-ssa-reassoc.c       |  2 +-
 gcc/tree-ssa-tail-merge.c    |  2 +-
 gcc/tree-ssa-threadedge.c    |  2 +-
 gcc/tree-ssa.c               | 10 ++++-----
 gcc/tree-ssanames.c          |  2 +-
 gcc/tree-vect-loop-manip.c   |  8 +++----
 gcc/tree-vect-loop.c         |  4 ++--
 gcc/tree.h                   |  8 ++++++-
 gcc/valtrack.c               |  2 +-
 gcc/var-tracking.c           | 50 +++++++++++++++++++++-----------------------
 39 files changed, 175 insertions(+), 104 deletions(-)

Comments

Richard Biener Oct. 9, 2017, 12:54 p.m. UTC | #1
On Sat, Sep 30, 2017 at 11:08 AM, Alexandre Oliva <aoliva@redhat.com> wrote:
> This patch introduces a number of new macros and functions that will
> be used to distinguish between different kinds of debug stmts, insns
> and notes, namely, preexisting debug bind ones and to-be-introduced
> nonbind markers.
>
> In a seemingly mechanical way, it adjusts several uses of the macros
> and functions, so that they refer to narrower categories when
> appropriate.
>
> These changes, by themselves, should not have any visible effect in
> the compiler behavior, since the upcoming debug markers are never
> created with this patch alone.

Ok.

Thanks,
Richard.

> for  gcc/ChangeLog
>
>         * gimple.h (enum gimple_debug_subcode): Add
>         GIMPLE_DEBUG_BEGIN_STMT.
>         (gimple_debug_begin_stmt_p): New.
>         (gimple_debug_nonbind_marker_p): New.
>         * tree.h (MAY_HAVE_DEBUG_MARKER_STMTS): New.
>         (MAY_HAVE_DEBUG_BIND_STMTS): Renamed from....
>         (MAY_HAVE_DEBUG_STMTS): ... this.  Check both.
>         * insn-notes.def (BEGIN_STMT): New.
>         * rtl.h (MAY_HAVE_DEBUG_MARKER_INSNS): New.
>         (MAY_HAVE_DEBUG_BIND_INSNS): Renamed from....
>         (MAY_HAVE_DEBUG_INSNS): ... this.  Check both.
>         (NOTE_MARKER_LOCATION, NOTE_MARKER_P): New.
>         (DEBUG_BIND_INSN_P, DEBUG_MARKER_INSN_P): New.
>         (INSN_DEBUG_MARKER_KIND): New.
>         (INSN_VAR_LOCATION): Check for VAR_LOCATION.
>         (INSN_VAR_LOCATION_PTR): New.
>         * cfgexpand.c (expand_debug_locations): Handle debug bind insns
>         only.
>         (expand_gimple_basic_block): Likewise.  Emit debug temps for TER
>         deps only if debug bind insns are enabled.
>         (pass_expand::execute): Avoid deep TER and expand
>         debug locations for debug bind insns only.
>         * cgraph.c (cgraph_edge::redirect_call_stmt_to_callee): Narrow
>         debug stmts special handling down to debug bind stmts.
>         * combine.c (try_combine): Narrow debug insns special handling
>         down to debug bind insns.
>         * cse.c (delete_trivially_dead_insns): Handle debug bindings.
>         Narrow debug insns preexisting special handling down to debug
>         bind insns.
>         * dce.c (rest_of_handle_ud_dce): Narrow debug insns special
>         handling down to debug bind insns.
>         * function.c (instantiate_virtual_regs): Skip debug markers,
>         adjust handling of debug binds.
>         * gimple-ssa-backprop.c (backprop::prepare_change): Try debug
>         temp insertion iff MAY_HAVE_DEBUG_BIND_STMTS.
>         * haifa-sched.c (schedule_insn): Narrow special handling of debug
>         insns to debug bind insns.
>         * ipa-prop.c (ipa_modify_call_arguments): Narrow special
>         handling of debug insns to debug bind insns.
>         * ipa-split.c (split_function): Likewise.
>         * ira.c (combine_and_move_insns): Adjust debug bind insns only.
>         * loop-unroll.c (apply_opt_in_copies): Adjust tests on bind
>         debug insns.
>         * reg-stack.c (convert_regs_1): Use DEBUG_BIND_INSN_P.
>         * regrename.c (build_def_use): Likewise.
>         * regcprop.c (copyprop_hardreg_forward_1): Likewise.
>         (pass_cprop_hardreg): Narrow special casing of debug insns to
>         debug bind insns.
>         * regstat.c (regstat_init_n_sets_and_refs): Likewise.
>         * reload1.c (reload): Likewise.
>         * sese.c (sese_build_liveouts): Narrow special casing of debug
>         stmts to debug bind stmts.
>         * shrink-wrap.c (move_insn_for_shrink_wrap): Likewise.
>         * ssa-iterators.h (num_imm_uses): Likewise.
>         * tree-cfg.c (gimple_merge_blocks): Narrow special casing of
>         debug stmts to debug bind stmts.
>         * tree-inline.c (tree_function_versioning): Narrow special casing
>         of debug stmts to debug bind stmts.
>         * tree-loop-distribution.c (generate_loops_for_partition):
>         Narrow special casing of debug stmts to debug bind stmts.
>         * tree-sra.c (analyze_access_subtree): Narrow special casing
>         of debug stmts to debug bind stmts.
>         * tree-ssa-dce.c (remove_dead_stmt): Narrow special casing of debug
>         stmts to debug bind stmts.
>         * tree-ssa-loop-ivopt.c (remove_unused_ivs): Narrow special
>         casing of debug stmts to debug bind stmts.
>         * tree-ssa-reassoc.c (reassoc_remove_stmt): Likewise.
>         * tree-ssa-tail-merge.c (tail_merge_optimize): Narrow special
>         casing of debug stmts to debug bind stmts.
>         * tree-ssa-threadedge.c (propagate_threaded_block_debug_info):
>         Likewise.
>         * tree-ssa.c (flush_pending_stmts): Narrow special casing of
>         debug stmts to debug bind stmts.
>         (gimple_replace_ssa_lhs): Likewise.
>         (insert_debug_temp_for_var_def): Likewise.
>         (insert_debug_temps_for_defs): Likewise.
>         (reset_debug_uses): Likewise.
>         * tree-ssanames.c (release_ssa_name_fn): Likewise.
>         * tree-vect-loop-manip.c (adjust_debug_stmts_now): Likewise.
>         (adjust_debug_stmts): Likewise.
>         (adjust_phi_and_debug_stmts): Likewise.
>         (vect_do_peeling): Likewise.
>         * tree-vect-loop.c (vect_transform_loop): Likewise.
>         * valtrack.c (propagate_for_debug): Use BIND_DEBUG_INSN_P.
>         * var-tracking.c (adjust_mems): Narrow special casing of debug
>         insns to debug bind insns.
>         (dv_onepart_p, dataflow_set_clar_at_call, use_type): Likewise.
>         (compute_bb_dataflow, vt_find_locations): Likewise.
>         (vt_expand_loc, emit_notes_for_changes): Likewise.
>         (vt_init_cfa_base): Likewise.
>         (vt_emit_notes): Likewise.
>         (vt_initialize): Likewise.
>         (vt_finalize): Likewise.
> ---
>  gcc/cfgexpand.c              |  8 +++----
>  gcc/cgraph.c                 |  2 +-
>  gcc/combine.c                | 12 +++++------
>  gcc/cse.c                    | 17 ++++++++-------
>  gcc/dce.c                    |  2 +-
>  gcc/function.c               |  7 ++++---
>  gcc/gimple-ssa-backprop.c    |  2 +-
>  gcc/gimple.h                 | 31 ++++++++++++++++++++++-----
>  gcc/haifa-sched.c            |  4 ++--
>  gcc/insn-notes.def           |  3 +++
>  gcc/ipa-prop.c               |  2 +-
>  gcc/ipa-split.c              | 11 +++++-----
>  gcc/ira.c                    |  4 ++--
>  gcc/loop-unroll.c            |  6 ++++--
>  gcc/reg-stack.c              |  4 ++--
>  gcc/regcprop.c               |  4 ++--
>  gcc/regrename.c              |  2 +-
>  gcc/regstat.c                |  2 +-
>  gcc/reload1.c                |  4 ++--
>  gcc/rtl.h                    | 40 +++++++++++++++++++++++++++++++++--
>  gcc/sese.c                   |  2 +-
>  gcc/shrink-wrap.c            |  4 ++--
>  gcc/ssa-iterators.h          |  2 +-
>  gcc/tree-cfg.c               |  2 +-
>  gcc/tree-inline.c            |  4 ++--
>  gcc/tree-loop-distribution.c |  2 +-
>  gcc/tree-sra.c               |  2 +-
>  gcc/tree-ssa-dce.c           |  2 +-
>  gcc/tree-ssa-loop-ivopts.c   |  2 +-
>  gcc/tree-ssa-reassoc.c       |  2 +-
>  gcc/tree-ssa-tail-merge.c    |  2 +-
>  gcc/tree-ssa-threadedge.c    |  2 +-
>  gcc/tree-ssa.c               | 10 ++++-----
>  gcc/tree-ssanames.c          |  2 +-
>  gcc/tree-vect-loop-manip.c   |  8 +++----
>  gcc/tree-vect-loop.c         |  4 ++--
>  gcc/tree.h                   |  8 ++++++-
>  gcc/valtrack.c               |  2 +-
>  gcc/var-tracking.c           | 50 +++++++++++++++++++++-----------------------
>  39 files changed, 175 insertions(+), 104 deletions(-)
>
> diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
> index bd3312e..cb866aa 100644
> --- a/gcc/cfgexpand.c
> +++ b/gcc/cfgexpand.c
> @@ -5285,7 +5285,7 @@ expand_debug_locations (void)
>    flag_strict_aliasing = 0;
>
>    for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
> -    if (DEBUG_INSN_P (insn))
> +    if (DEBUG_BIND_INSN_P (insn))
>        {
>         tree value = (tree)INSN_VAR_LOCATION_LOC (insn);
>         rtx val;
> @@ -5538,7 +5538,7 @@ expand_gimple_basic_block (basic_block bb, bool disable_tail_calls)
>            a_2 = ...
>             #DEBUG ... => #D1
>          */
> -      if (MAY_HAVE_DEBUG_INSNS
> +      if (MAY_HAVE_DEBUG_BIND_INSNS
>           && SA.values
>           && !is_gimple_debug (stmt))
>         {
> @@ -6165,7 +6165,7 @@ pass_expand::execute (function *fun)
>    timevar_pop (TV_OUT_OF_SSA);
>    SA.partition_to_pseudo = XCNEWVEC (rtx, SA.map->num_partitions);
>
> -  if (MAY_HAVE_DEBUG_STMTS && flag_tree_ter)
> +  if (MAY_HAVE_DEBUG_BIND_STMTS && flag_tree_ter)
>      {
>        gimple_stmt_iterator gsi;
>        FOR_EACH_BB_FN (bb, cfun)
> @@ -6356,7 +6356,7 @@ pass_expand::execute (function *fun)
>                   next_bb)
>      bb = expand_gimple_basic_block (bb, var_ret_seq != NULL_RTX);
>
> -  if (MAY_HAVE_DEBUG_INSNS)
> +  if (MAY_HAVE_DEBUG_BIND_INSNS)
>      expand_debug_locations ();
>
>    if (deep_ter_debug_map)
> diff --git a/gcc/cgraph.c b/gcc/cgraph.c
> index 3d0cefb..cd60193 100644
> --- a/gcc/cgraph.c
> +++ b/gcc/cgraph.c
> @@ -1459,7 +1459,7 @@ cgraph_edge::redirect_call_stmt_to_callee (void)
>          stmts and associate D#X with parm in decl_debug_args_lookup
>          vector to say for debug info that if parameter parm had been passed,
>          it would have value parm_Y(D).  */
> -      if (e->callee->clone.combined_args_to_skip && MAY_HAVE_DEBUG_STMTS)
> +      if (e->callee->clone.combined_args_to_skip && MAY_HAVE_DEBUG_BIND_STMTS)
>         {
>           vec<tree, va_gc> **debug_args
>             = decl_debug_args_lookup (e->callee->decl);
> diff --git a/gcc/combine.c b/gcc/combine.c
> index e502fa1..86d710d 100644
> --- a/gcc/combine.c
> +++ b/gcc/combine.c
> @@ -3726,7 +3726,7 @@ try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0,
>           /* *SPLIT may be part of I2SRC, so make sure we have the
>              original expression around for later debug processing.
>              We should not need I2SRC any more in other cases.  */
> -         if (MAY_HAVE_DEBUG_INSNS)
> +         if (MAY_HAVE_DEBUG_BIND_INSNS)
>             i2src = copy_rtx (i2src);
>           else
>             i2src = NULL;
> @@ -4083,7 +4083,7 @@ try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0,
>        return 0;
>      }
>
> -  if (MAY_HAVE_DEBUG_INSNS)
> +  if (MAY_HAVE_DEBUG_BIND_INSNS)
>      {
>        struct undo *undo;
>
> @@ -4396,7 +4396,7 @@ try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0,
>
>      if (newi2pat)
>        {
> -       if (MAY_HAVE_DEBUG_INSNS && i2scratch)
> +       if (MAY_HAVE_DEBUG_BIND_INSNS && i2scratch)
>           propagate_for_debug (i2, last_combined_insn, i2dest, i2src,
>                                this_basic_block);
>         INSN_CODE (i2) = i2_code_number;
> @@ -4404,7 +4404,7 @@ try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0,
>        }
>      else
>        {
> -       if (MAY_HAVE_DEBUG_INSNS && i2src)
> +       if (MAY_HAVE_DEBUG_BIND_INSNS && i2src)
>           propagate_for_debug (i2, last_combined_insn, i2dest, i2src,
>                                this_basic_block);
>         SET_INSN_DELETED (i2);
> @@ -4414,7 +4414,7 @@ try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0,
>        {
>         LOG_LINKS (i1) = NULL;
>         REG_NOTES (i1) = 0;
> -       if (MAY_HAVE_DEBUG_INSNS)
> +       if (MAY_HAVE_DEBUG_BIND_INSNS)
>           propagate_for_debug (i1, last_combined_insn, i1dest, i1src,
>                                this_basic_block);
>         SET_INSN_DELETED (i1);
> @@ -4424,7 +4424,7 @@ try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0,
>        {
>         LOG_LINKS (i0) = NULL;
>         REG_NOTES (i0) = 0;
> -       if (MAY_HAVE_DEBUG_INSNS)
> +       if (MAY_HAVE_DEBUG_BIND_INSNS)
>           propagate_for_debug (i0, last_combined_insn, i0dest, i0src,
>                                this_basic_block);
>         SET_INSN_DELETED (i0);
> diff --git a/gcc/cse.c b/gcc/cse.c
> index 672fd2e..d1577a6 100644
> --- a/gcc/cse.c
> +++ b/gcc/cse.c
> @@ -7054,11 +7054,11 @@ delete_trivially_dead_insns (rtx_insn *insns, int nreg)
>
>    timevar_push (TV_DELETE_TRIVIALLY_DEAD);
>    /* First count the number of times each register is used.  */
> -  if (MAY_HAVE_DEBUG_INSNS)
> +  if (MAY_HAVE_DEBUG_BIND_INSNS)
>      {
>        counts = XCNEWVEC (int, nreg * 3);
>        for (insn = insns; insn; insn = NEXT_INSN (insn))
> -       if (DEBUG_INSN_P (insn))
> +       if (DEBUG_BIND_INSN_P (insn))
>           count_reg_usage (INSN_VAR_LOCATION_LOC (insn), counts + nreg,
>                            NULL_RTX, 1);
>         else if (INSN_P (insn))
> @@ -7116,12 +7116,15 @@ delete_trivially_dead_insns (rtx_insn *insns, int nreg)
>        if (! live_insn && dbg_cnt (delete_trivial_dead))
>         {
>           if (DEBUG_INSN_P (insn))
> -           count_reg_usage (INSN_VAR_LOCATION_LOC (insn), counts + nreg,
> -                            NULL_RTX, -1);
> +           {
> +             if (DEBUG_BIND_INSN_P (insn))
> +               count_reg_usage (INSN_VAR_LOCATION_LOC (insn), counts + nreg,
> +                                NULL_RTX, -1);
> +           }
>           else
>             {
>               rtx set;
> -             if (MAY_HAVE_DEBUG_INSNS
> +             if (MAY_HAVE_DEBUG_BIND_INSNS
>                   && (set = single_set (insn)) != NULL_RTX
>                   && is_dead_reg (SET_DEST (set), counts)
>                   /* Used at least once in some DEBUG_INSN.  */
> @@ -7161,10 +7164,10 @@ delete_trivially_dead_insns (rtx_insn *insns, int nreg)
>         }
>      }
>
> -  if (MAY_HAVE_DEBUG_INSNS)
> +  if (MAY_HAVE_DEBUG_BIND_INSNS)
>      {
>        for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
> -       if (DEBUG_INSN_P (insn))
> +       if (DEBUG_BIND_INSN_P (insn))
>           {
>             /* If this debug insn references a dead register that wasn't replaced
>                with an DEBUG_EXPR, reset the DEBUG_INSN.  */
> diff --git a/gcc/dce.c b/gcc/dce.c
> index 7534d2a..6fd9548 100644
> --- a/gcc/dce.c
> +++ b/gcc/dce.c
> @@ -777,7 +777,7 @@ rest_of_handle_ud_dce (void)
>      }
>    worklist.release ();
>
> -  if (MAY_HAVE_DEBUG_INSNS)
> +  if (MAY_HAVE_DEBUG_BIND_INSNS)
>      reset_unmarked_insns_debug_uses ();
>
>    /* Before any insns are deleted, we must remove the chains since
> diff --git a/gcc/function.c b/gcc/function.c
> index c03e2ac..ae61d3d 100644
> --- a/gcc/function.c
> +++ b/gcc/function.c
> @@ -1951,10 +1951,11 @@ instantiate_virtual_regs (void)
>            Fortunately, they shouldn't contain virtual registers either.  */
>          if (GET_CODE (PATTERN (insn)) == USE
>             || GET_CODE (PATTERN (insn)) == CLOBBER
> -           || GET_CODE (PATTERN (insn)) == ASM_INPUT)
> +           || GET_CODE (PATTERN (insn)) == ASM_INPUT
> +           || DEBUG_MARKER_INSN_P (insn))
>           continue;
> -       else if (DEBUG_INSN_P (insn))
> -         instantiate_virtual_regs_in_rtx (&INSN_VAR_LOCATION (insn));
> +       else if (DEBUG_BIND_INSN_P (insn))
> +         instantiate_virtual_regs_in_rtx (INSN_VAR_LOCATION_PTR (insn));
>         else
>           instantiate_virtual_regs_in_insn (insn);
>
> diff --git a/gcc/gimple-ssa-backprop.c b/gcc/gimple-ssa-backprop.c
> index f321ebb..b6e11c4 100644
> --- a/gcc/gimple-ssa-backprop.c
> +++ b/gcc/gimple-ssa-backprop.c
> @@ -726,7 +726,7 @@ strip_sign_op (tree rhs)
>  void
>  backprop::prepare_change (tree var)
>  {
> -  if (MAY_HAVE_DEBUG_STMTS)
> +  if (MAY_HAVE_DEBUG_BIND_STMTS)
>      insert_debug_temp_for_var_def (NULL, var);
>    reset_flow_sensitive_info (var);
>  }
> diff --git a/gcc/gimple.h b/gcc/gimple.h
> index 6213c49..1783e11 100644
> --- a/gcc/gimple.h
> +++ b/gcc/gimple.h
> @@ -198,13 +198,12 @@ enum gf_mask {
>      GF_PREDICT_TAKEN           = 1 << 15
>  };
>
> -/* Currently, there are only two types of gimple debug stmt.  Others are
> -   envisioned, for example, to enable the generation of is_stmt notes
> -   in line number information, to mark sequence points, etc.  This
> -   subcode is to be used to tell them apart.  */
> +/* This subcode tells apart different kinds of stmts that are not used
> +   for codegen, but rather to retain debug information.  */
>  enum gimple_debug_subcode {
>    GIMPLE_DEBUG_BIND = 0,
> -  GIMPLE_DEBUG_SOURCE_BIND = 1
> +  GIMPLE_DEBUG_SOURCE_BIND = 1,
> +  GIMPLE_DEBUG_BEGIN_STMT = 2
>  };
>
>  /* Masks for selecting a pass local flag (PLF) to work on.  These
> @@ -4739,6 +4738,28 @@ gimple_debug_source_bind_set_value (gimple *dbg, tree value)
>    gimple_set_op (dbg, 1, value);
>  }
>
> +/* Return true if S is a GIMPLE_DEBUG BEGIN_STMT statement.  */
> +
> +static inline bool
> +gimple_debug_begin_stmt_p (const gimple *s)
> +{
> +  if (is_gimple_debug (s))
> +    return s->subcode == GIMPLE_DEBUG_BEGIN_STMT;
> +
> +  return false;
> +}
> +
> +/* Return true if S is a GIMPLE_DEBUG non-binding marker statement.  */
> +
> +static inline bool
> +gimple_debug_nonbind_marker_p (const gimple *s)
> +{
> +  if (is_gimple_debug (s))
> +    return s->subcode == GIMPLE_DEBUG_BEGIN_STMT;
> +
> +  return false;
> +}
> +
>  /* Return the line number for EXPR, or return -1 if we have no line
>     number information for it.  */
>  static inline int
> diff --git a/gcc/haifa-sched.c b/gcc/haifa-sched.c
> index 549e896..34cc46b 100644
> --- a/gcc/haifa-sched.c
> +++ b/gcc/haifa-sched.c
> @@ -4010,7 +4010,7 @@ schedule_insn (rtx_insn *insn)
>    gcc_assert (sd_lists_empty_p (insn, SD_LIST_HARD_BACK));
>
>    /* Reset debug insns invalidated by moving this insn.  */
> -  if (MAY_HAVE_DEBUG_INSNS && !DEBUG_INSN_P (insn))
> +  if (MAY_HAVE_DEBUG_BIND_INSNS && !DEBUG_INSN_P (insn))
>      for (sd_it = sd_iterator_start (insn, SD_LIST_BACK);
>          sd_iterator_cond (&sd_it, &dep);)
>        {
> @@ -4023,7 +4023,7 @@ schedule_insn (rtx_insn *insn)
>             continue;
>           }
>
> -       gcc_assert (DEBUG_INSN_P (dbg));
> +       gcc_assert (DEBUG_BIND_INSN_P (dbg));
>
>         if (sched_verbose >= 6)
>           fprintf (sched_dump, ";;\t\tresetting: debug insn %d\n",
> diff --git a/gcc/insn-notes.def b/gcc/insn-notes.def
> index f96ce18..960487b 100644
> --- a/gcc/insn-notes.def
> +++ b/gcc/insn-notes.def
> @@ -68,6 +68,9 @@ INSN_NOTE (VAR_LOCATION)
>  /* The values passed to callee.  */
>  INSN_NOTE (CALL_ARG_LOCATION)
>
> +/* The beginning of a statement.  */
> +INSN_NOTE (BEGIN_STMT)
> +
>  /* Record the struct for the following basic block.  Uses
>     NOTE_BASIC_BLOCK.  FIXME: Redundant with the basic block pointer
>     now included in every insn.  NOTE: If there's no CFG anymore, in other words,
> diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c
> index 51f6221..2d15504 100644
> --- a/gcc/ipa-prop.c
> +++ b/gcc/ipa-prop.c
> @@ -4410,7 +4410,7 @@ ipa_modify_call_arguments (struct cgraph_edge *cs, gcall *stmt,
>             }
>           vargs.quick_push (expr);
>         }
> -      if (adj->op != IPA_PARM_OP_COPY && MAY_HAVE_DEBUG_STMTS)
> +      if (adj->op != IPA_PARM_OP_COPY && MAY_HAVE_DEBUG_BIND_STMTS)
>         {
>           unsigned int ix;
>           tree ddecl = NULL_TREE, origin = DECL_ORIGIN (adj->base), arg;
> diff --git a/gcc/ipa-split.c b/gcc/ipa-split.c
> index e3759d6..d45e951 100644
> --- a/gcc/ipa-split.c
> +++ b/gcc/ipa-split.c
> @@ -1471,7 +1471,7 @@ split_function (basic_block return_bb, struct split_point *split_point,
>      {
>        vec<tree, va_gc> **debug_args = NULL;
>        unsigned i = 0, len = 0;
> -      if (MAY_HAVE_DEBUG_STMTS)
> +      if (MAY_HAVE_DEBUG_BIND_STMTS)
>         {
>           debug_args = decl_debug_args_lookup (node->decl);
>           if (debug_args)
> @@ -1484,11 +1484,12 @@ split_function (basic_block return_bb, struct split_point *split_point,
>             tree ddecl;
>             gimple *def_temp;
>
> -           /* This needs to be done even without MAY_HAVE_DEBUG_STMTS,
> -              otherwise if it didn't exist before, we'd end up with
> -              different SSA_NAME_VERSIONs between -g and -g0.  */
> +           /* This needs to be done even without
> +              MAY_HAVE_DEBUG_BIND_STMTS, otherwise if it didn't exist
> +              before, we'd end up with different SSA_NAME_VERSIONs
> +              between -g and -g0.  */
>             arg = get_or_create_ssa_default_def (cfun, parm);
> -           if (!MAY_HAVE_DEBUG_STMTS || debug_args == NULL)
> +           if (!MAY_HAVE_DEBUG_BIND_STMTS || debug_args == NULL)
>               continue;
>
>             while (i < len && (**debug_args)[i] != DECL_ORIGIN (parm))
> diff --git a/gcc/ira.c b/gcc/ira.c
> index 046ce3b..17f54a0 100644
> --- a/gcc/ira.c
> +++ b/gcc/ira.c
> @@ -3842,9 +3842,9 @@ combine_and_move_insns (void)
>         }
>
>        /* Last pass - adjust debug insns referencing cleared regs.  */
> -      if (MAY_HAVE_DEBUG_INSNS)
> +      if (MAY_HAVE_DEBUG_BIND_INSNS)
>         for (rtx_insn *insn = get_insns (); insn; insn = NEXT_INSN (insn))
> -         if (DEBUG_INSN_P (insn))
> +         if (DEBUG_BIND_INSN_P (insn))
>             {
>               rtx old_loc = INSN_VAR_LOCATION_LOC (insn);
>               INSN_VAR_LOCATION_LOC (insn)
> diff --git a/gcc/loop-unroll.c b/gcc/loop-unroll.c
> index 322f151..923be72 100644
> --- a/gcc/loop-unroll.c
> +++ b/gcc/loop-unroll.c
> @@ -2026,12 +2026,14 @@ apply_opt_in_copies (struct opt_info *opt_info,
>        FOR_BB_INSNS_SAFE (bb, insn, next)
>          {
>           if (!INSN_P (insn)
> -             || (DEBUG_INSN_P (insn)
> +             || (DEBUG_BIND_INSN_P (insn)
> +                 && INSN_VAR_LOCATION_DECL (insn)
>                   && TREE_CODE (INSN_VAR_LOCATION_DECL (insn)) == LABEL_DECL))
>              continue;
>
>           while (!INSN_P (orig_insn)
> -                || (DEBUG_INSN_P (orig_insn)
> +                || (DEBUG_BIND_INSN_P (orig_insn)
> +                    && INSN_VAR_LOCATION_DECL (orig_insn)
>                      && (TREE_CODE (INSN_VAR_LOCATION_DECL (orig_insn))
>                          == LABEL_DECL)))
>              orig_insn = NEXT_INSN (orig_insn);
> diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c
> index f238106..e62ccda 100644
> --- a/gcc/reg-stack.c
> +++ b/gcc/reg-stack.c
> @@ -3028,7 +3028,7 @@ convert_regs_1 (basic_block block)
>
>        /* Don't bother processing unless there is a stack reg
>          mentioned or if it's a CALL_INSN.  */
> -      if (DEBUG_INSN_P (insn))
> +      if (DEBUG_BIND_INSN_P (insn))
>         {
>           if (starting_stack_p)
>             debug_insns_with_starting_stack++;
> @@ -3068,7 +3068,7 @@ convert_regs_1 (basic_block block)
>        for (insn = BB_HEAD (block); debug_insns_with_starting_stack;
>            insn = NEXT_INSN (insn))
>         {
> -         if (!DEBUG_INSN_P (insn))
> +         if (!DEBUG_BIND_INSN_P (insn))
>             continue;
>
>           debug_insns_with_starting_stack--;
> diff --git a/gcc/regcprop.c b/gcc/regcprop.c
> index 73e945d4..0ce64d7 100644
> --- a/gcc/regcprop.c
> +++ b/gcc/regcprop.c
> @@ -757,7 +757,7 @@ copyprop_hardreg_forward_1 (basic_block bb, struct value_data *vd)
>        next = NEXT_INSN (insn);
>        if (!NONDEBUG_INSN_P (insn))
>         {
> -         if (DEBUG_INSN_P (insn))
> +         if (DEBUG_BIND_INSN_P (insn))
>             {
>               rtx loc = INSN_VAR_LOCATION_LOC (insn);
>               if (!VAR_LOC_UNKNOWN_P (loc))
> @@ -1302,7 +1302,7 @@ pass_cprop_hardreg::execute (function *fun)
>        copyprop_hardreg_forward_1 (bb, all_vd + bb->index);
>      }
>
> -  if (MAY_HAVE_DEBUG_INSNS)
> +  if (MAY_HAVE_DEBUG_BIND_INSNS)
>      {
>        FOR_EACH_BB_FN (bb, fun)
>         if (bitmap_bit_p (visited, bb->index)
> diff --git a/gcc/regrename.c b/gcc/regrename.c
> index 7fbfa31..89380a8 100644
> --- a/gcc/regrename.c
> +++ b/gcc/regrename.c
> @@ -1876,7 +1876,7 @@ build_def_use (basic_block bb)
>             if (REG_NOTE_KIND (note) == REG_CFA_RESTORE)
>               scan_rtx (insn, &XEXP (note, 0), NO_REGS, mark_all_read, OP_IN);
>         }
> -      else if (DEBUG_INSN_P (insn)
> +      else if (DEBUG_BIND_INSN_P (insn)
>                && !VAR_LOC_UNKNOWN_P (INSN_VAR_LOCATION_LOC (insn)))
>         {
>           scan_rtx (insn, &INSN_VAR_LOCATION_LOC (insn),
> diff --git a/gcc/regstat.c b/gcc/regstat.c
> index 3fd26fd..fd3d3a8 100644
> --- a/gcc/regstat.c
> +++ b/gcc/regstat.c
> @@ -54,7 +54,7 @@ regstat_init_n_sets_and_refs (void)
>
>    regstat_n_sets_and_refs = XNEWVEC (struct regstat_n_sets_and_refs_t, max_regno);
>
> -  if (MAY_HAVE_DEBUG_INSNS)
> +  if (MAY_HAVE_DEBUG_BIND_INSNS)
>      for (i = 0; i < max_regno; i++)
>        {
>         int use_count;
> diff --git a/gcc/reload1.c b/gcc/reload1.c
> index 5e200b9..cf18b30 100644
> --- a/gcc/reload1.c
> +++ b/gcc/reload1.c
> @@ -1112,7 +1112,7 @@ reload (rtx_insn *first, int global)
>        /* We don't want complex addressing modes in debug insns
>          if simpler ones will do, so delegitimize equivalences
>          in debug insns.  */
> -      if (MAY_HAVE_DEBUG_INSNS && reg_renumber[i] < 0)
> +      if (MAY_HAVE_DEBUG_BIND_INSNS && reg_renumber[i] < 0)
>         {
>           rtx reg = regno_reg_rtx[i];
>           rtx equiv = 0;
> @@ -1140,7 +1140,7 @@ reload (rtx_insn *first, int global)
>               while (next && DF_REF_INSN (next) == insn)
>                 next = DF_REF_NEXT_REG (next);
>
> -             if (DEBUG_INSN_P (insn))
> +             if (DEBUG_BIND_INSN_P (insn))
>                 {
>                   if (!equiv)
>                     {
> diff --git a/gcc/rtl.h b/gcc/rtl.h
> index 3bda77c..c79a277 100644
> --- a/gcc/rtl.h
> +++ b/gcc/rtl.h
> @@ -815,8 +815,13 @@ struct GTY(()) rtvec_def {
>  /* Predicate yielding nonzero iff X is an insn that is not a debug insn.  */
>  #define NONDEBUG_INSN_P(X) (INSN_P (X) && !DEBUG_INSN_P (X))
>
> +/* Nonzero if DEBUG_MARKER_INSN_P may possibly hold.  */
> +#define MAY_HAVE_DEBUG_MARKER_INSNS 0 /* debug_nonbind_markers_p */
> +/* Nonzero if DEBUG_BIND_INSN_P may possibly hold.  */
> +#define MAY_HAVE_DEBUG_BIND_INSNS flag_var_tracking_assignments
>  /* Nonzero if DEBUG_INSN_P may possibly hold.  */
> -#define MAY_HAVE_DEBUG_INSNS (flag_var_tracking_assignments)
> +#define MAY_HAVE_DEBUG_INSNS                                   \
> +  (MAY_HAVE_DEBUG_MARKER_INSNS || MAY_HAVE_DEBUG_BIND_INSNS)
>
>  /* Predicate yielding nonzero iff X is a real insn.  */
>  #define INSN_P(X) \
> @@ -1604,6 +1609,7 @@ extern const char * const reg_note_name[];
>  #define NOTE_EH_HANDLER(INSN)  XCINT (INSN, 3, NOTE)
>  #define NOTE_BASIC_BLOCK(INSN) XCBBDEF (INSN, 3, NOTE)
>  #define NOTE_VAR_LOCATION(INSN)        XCEXP (INSN, 3, NOTE)
> +#define NOTE_MARKER_LOCATION(INSN) XCUINT (INSN, 3, NOTE)
>  #define NOTE_CFI(INSN)         XCCFI (INSN, 3, NOTE)
>  #define NOTE_LABEL_NUMBER(INSN)        XCINT (INSN, 3, NOTE)
>
> @@ -1615,6 +1621,12 @@ extern const char * const reg_note_name[];
>  #define NOTE_INSN_BASIC_BLOCK_P(INSN) \
>    (NOTE_P (INSN) && NOTE_KIND (INSN) == NOTE_INSN_BASIC_BLOCK)
>
> +/* Nonzero if INSN is a debug nonbind marker note,
> +   for which NOTE_MARKER_LOCATION can be used.  */
> +#define NOTE_MARKER_P(INSN)                            \
> +  (NOTE_P (INSN) &&                                    \
> +   (NOTE_KIND (INSN) == NOTE_INSN_BEGIN_STMT))
> +
>  /* Variable declaration and the location of a variable.  */
>  #define PAT_VAR_LOCATION_DECL(PAT) (XCTREE ((PAT), 0, VAR_LOCATION))
>  #define PAT_VAR_LOCATION_LOC(PAT) (XCEXP ((PAT), 1, VAR_LOCATION))
> @@ -1634,8 +1646,32 @@ extern const char * const reg_note_name[];
>  #define NOTE_VAR_LOCATION_STATUS(NOTE) \
>    PAT_VAR_LOCATION_STATUS (NOTE_VAR_LOCATION (NOTE))
>
> +/* Evaluate to TRUE if INSN is a debug insn that denotes a variable
> +   location/value tracking annotation.  */
> +#define DEBUG_BIND_INSN_P(INSN)                        \
> +  (DEBUG_INSN_P (INSN)                         \
> +   && (GET_CODE (PATTERN (INSN))               \
> +       == VAR_LOCATION))
> +/* Evaluate to TRUE if INSN is a debug insn that denotes a program
> +   source location marker.  */
> +#define DEBUG_MARKER_INSN_P(INSN)              \
> +  (DEBUG_INSN_P (INSN)                         \
> +   && (GET_CODE (PATTERN (INSN))               \
> +       != VAR_LOCATION))
> +/* Evaluate to the marker kind.  */
> +#define INSN_DEBUG_MARKER_KIND(INSN)             \
> +  (GET_CODE (PATTERN (INSN)) == DEBUG_MARKER     \
> +   ? (GET_MODE (PATTERN (INSN)) == VOIDmode      \
> +      ? NOTE_INSN_BEGIN_STMT                     \
> +      : (enum insn_note)-1)                      \
> +   : (enum insn_note)-1)
> +
>  /* The VAR_LOCATION rtx in a DEBUG_INSN.  */
> -#define INSN_VAR_LOCATION(INSN) PATTERN (INSN)
> +#define INSN_VAR_LOCATION(INSN) \
> +  (RTL_FLAG_CHECK1 ("INSN_VAR_LOCATION", PATTERN (INSN), VAR_LOCATION))
> +/* A pointer to the VAR_LOCATION rtx in a DEBUG_INSN.  */
> +#define INSN_VAR_LOCATION_PTR(INSN) \
> +  (&PATTERN (INSN))
>
>  /* Accessors for a tree-expanded var location debug insn.  */
>  #define INSN_VAR_LOCATION_DECL(INSN) \
> diff --git a/gcc/sese.c b/gcc/sese.c
> index ad85aa4..a24688f 100644
> --- a/gcc/sese.c
> +++ b/gcc/sese.c
> @@ -164,7 +164,7 @@ sese_build_liveouts (sese_info_p region, bitmap liveouts)
>        sese_build_liveouts_bb (region, liveouts, bb);
>
>    /* FIXME: We could start iterating form the successor of sese.  */
> -  if (MAY_HAVE_DEBUG_STMTS)
> +  if (MAY_HAVE_DEBUG_BIND_STMTS)
>      FOR_EACH_BB_FN (bb, cfun)
>        if (!bb_in_sese_p (bb, region->region))
>         sese_reset_debug_liveouts_bb (region, liveouts, bb);
> diff --git a/gcc/shrink-wrap.c b/gcc/shrink-wrap.c
> index 3cad776..85fe81d 100644
> --- a/gcc/shrink-wrap.c
> +++ b/gcc/shrink-wrap.c
> @@ -309,10 +309,10 @@ move_insn_for_shrink_wrap (basic_block bb, rtx_insn *insn,
>       move it as far as we can.  */
>    do
>      {
> -      if (MAY_HAVE_DEBUG_INSNS)
> +      if (MAY_HAVE_DEBUG_BIND_INSNS)
>         {
>           FOR_BB_INSNS_REVERSE (bb, dinsn)
> -           if (DEBUG_INSN_P (dinsn))
> +           if (DEBUG_BIND_INSN_P (dinsn))
>               {
>                 df_ref use;
>                 FOR_EACH_INSN_USE (use, dinsn)
> diff --git a/gcc/ssa-iterators.h b/gcc/ssa-iterators.h
> index c8aa77b..dca0439 100644
> --- a/gcc/ssa-iterators.h
> +++ b/gcc/ssa-iterators.h
> @@ -447,7 +447,7 @@ num_imm_uses (const_tree var)
>    const ssa_use_operand_t *ptr;
>    unsigned int num = 0;
>
> -  if (!MAY_HAVE_DEBUG_STMTS)
> +  if (!MAY_HAVE_DEBUG_BIND_STMTS)
>      {
>        for (ptr = start->next; ptr != start; ptr = ptr->next)
>         if (USE_STMT (ptr))
> diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
> index 99d1f1e..dc9ce3c 100644
> --- a/gcc/tree-cfg.c
> +++ b/gcc/tree-cfg.c
> @@ -2054,7 +2054,7 @@ gimple_merge_blocks (basic_block a, basic_block b)
>               gsi_insert_before (&dest_gsi, stmt, GSI_NEW_STMT);
>             }
>           /* Other user labels keep around in a form of a debug stmt.  */
> -         else if (!DECL_ARTIFICIAL (label) && MAY_HAVE_DEBUG_STMTS)
> +         else if (!DECL_ARTIFICIAL (label) && MAY_HAVE_DEBUG_BIND_STMTS)
>             {
>               gimple *dbg = gimple_build_debug_bind (label,
>                                                      integer_zero_node,
> diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
> index a226096..a142488 100644
> --- a/gcc/tree-inline.c
> +++ b/gcc/tree-inline.c
> @@ -6032,7 +6032,7 @@ tree_function_versioning (tree old_decl, tree new_decl,
>                                             &vars);
>                 if (init)
>                   init_stmts.safe_push (init);
> -               if (MAY_HAVE_DEBUG_STMTS && args_to_skip)
> +               if (MAY_HAVE_DEBUG_BIND_STMTS && args_to_skip)
>                   {
>                     if (parm_num == -1)
>                       {
> @@ -6178,7 +6178,7 @@ tree_function_versioning (tree old_decl, tree new_decl,
>         }
>      }
>
> -  if (debug_args_to_skip && MAY_HAVE_DEBUG_STMTS)
> +  if (debug_args_to_skip && MAY_HAVE_DEBUG_BIND_STMTS)
>      {
>        tree parm;
>        vec<tree, va_gc> **debug_args = NULL;
> diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c
> index 26b8b9a..65ccd71 100644
> --- a/gcc/tree-loop-distribution.c
> +++ b/gcc/tree-loop-distribution.c
> @@ -807,7 +807,7 @@ generate_loops_for_partition (struct loop *loop, partition *partition,
>    /* Remove stmts not in the PARTITION bitmap.  */
>    bbs = get_loop_body_in_dom_order (loop);
>
> -  if (MAY_HAVE_DEBUG_STMTS)
> +  if (MAY_HAVE_DEBUG_BIND_STMTS)
>      for (i = 0; i < loop->num_nodes; i++)
>        {
>         basic_block bb = bbs[i];
> diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
> index f5675ed..e7167e7 100644
> --- a/gcc/tree-sra.c
> +++ b/gcc/tree-sra.c
> @@ -2477,7 +2477,7 @@ analyze_access_subtree (struct access *root, struct access *parent,
>           gcc_checking_assert (!root->grp_scalar_read
>                                && !root->grp_assignment_read);
>           sth_created = true;
> -         if (MAY_HAVE_DEBUG_STMTS)
> +         if (MAY_HAVE_DEBUG_BIND_STMTS)
>             {
>               root->grp_to_be_debug_replaced = 1;
>               root->replacement_decl = create_access_replacement (root);
> diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c
> index e62afad..f60670f 100644
> --- a/gcc/tree-ssa-dce.c
> +++ b/gcc/tree-ssa-dce.c
> @@ -1086,7 +1086,7 @@ remove_dead_stmt (gimple_stmt_iterator *i, basic_block bb)
>
>    /* If this is a store into a variable that is being optimized away,
>       add a debug bind stmt if possible.  */
> -  if (MAY_HAVE_DEBUG_STMTS
> +  if (MAY_HAVE_DEBUG_BIND_STMTS
>        && gimple_assign_single_p (stmt)
>        && is_gimple_val (gimple_assign_rhs1 (stmt)))
>      {
> diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c
> index bbea619..f8fe317 100644
> --- a/gcc/tree-ssa-loop-ivopts.c
> +++ b/gcc/tree-ssa-loop-ivopts.c
> @@ -7148,7 +7148,7 @@ remove_unused_ivs (struct ivopts_data *data)
>
>           tree def = info->iv->ssa_name;
>
> -         if (MAY_HAVE_DEBUG_STMTS && SSA_NAME_DEF_STMT (def))
> +         if (MAY_HAVE_DEBUG_BIND_STMTS && SSA_NAME_DEF_STMT (def))
>             {
>               imm_use_iterator imm_iter;
>               use_operand_p use_p;
> diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c
> index b2d0f57..a671a16 100644
> --- a/gcc/tree-ssa-reassoc.c
> +++ b/gcc/tree-ssa-reassoc.c
> @@ -232,7 +232,7 @@ reassoc_remove_stmt (gimple_stmt_iterator *gsi)
>  {
>    gimple *stmt = gsi_stmt (*gsi);
>
> -  if (!MAY_HAVE_DEBUG_STMTS || gimple_code (stmt) == GIMPLE_PHI)
> +  if (!MAY_HAVE_DEBUG_BIND_STMTS || gimple_code (stmt) == GIMPLE_PHI)
>      return gsi_remove (gsi, true);
>
>    gimple_stmt_iterator prev = *gsi;
> diff --git a/gcc/tree-ssa-tail-merge.c b/gcc/tree-ssa-tail-merge.c
> index a65ff31..a3d5074 100644
> --- a/gcc/tree-ssa-tail-merge.c
> +++ b/gcc/tree-ssa-tail-merge.c
> @@ -1802,7 +1802,7 @@ tail_merge_optimize (unsigned int todo)
>
>    if (nr_bbs_removed_total > 0)
>      {
> -      if (MAY_HAVE_DEBUG_STMTS)
> +      if (MAY_HAVE_DEBUG_BIND_STMTS)
>         {
>           calculate_dominance_info (CDI_DOMINATORS);
>           update_debug_stmts ();
> diff --git a/gcc/tree-ssa-threadedge.c b/gcc/tree-ssa-threadedge.c
> index 536c471..70675e4 100644
> --- a/gcc/tree-ssa-threadedge.c
> +++ b/gcc/tree-ssa-threadedge.c
> @@ -692,7 +692,7 @@ simplify_control_stmt_condition_1 (edge e,
>  void
>  propagate_threaded_block_debug_into (basic_block dest, basic_block src)
>  {
> -  if (!MAY_HAVE_DEBUG_STMTS)
> +  if (!MAY_HAVE_DEBUG_BIND_STMTS)
>      return;
>
>    if (!single_pred_p (dest))
> diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c
> index 8b6da96..151f544 100644
> --- a/gcc/tree-ssa.c
> +++ b/gcc/tree-ssa.c
> @@ -220,7 +220,7 @@ flush_pending_stmts (edge e)
>  void
>  gimple_replace_ssa_lhs (gimple *stmt, tree nlhs)
>  {
> -  if (MAY_HAVE_DEBUG_STMTS)
> +  if (MAY_HAVE_DEBUG_BIND_STMTS)
>      {
>        tree lhs = gimple_get_lhs (stmt);
>
> @@ -242,7 +242,7 @@ gimple_replace_ssa_lhs (gimple *stmt, tree nlhs)
>  tree
>  target_for_debug_bind (tree var)
>  {
> -  if (!MAY_HAVE_DEBUG_STMTS)
> +  if (!MAY_HAVE_DEBUG_BIND_STMTS)
>      return NULL_TREE;
>
>    if (TREE_CODE (var) == SSA_NAME)
> @@ -307,7 +307,7 @@ insert_debug_temp_for_var_def (gimple_stmt_iterator *gsi, tree var)
>    int usecount = 0;
>    tree value = NULL;
>
> -  if (!MAY_HAVE_DEBUG_STMTS)
> +  if (!MAY_HAVE_DEBUG_BIND_STMTS)
>      return;
>
>    /* If this name has already been registered for replacement, do nothing
> @@ -495,7 +495,7 @@ insert_debug_temps_for_defs (gimple_stmt_iterator *gsi)
>    ssa_op_iter op_iter;
>    def_operand_p def_p;
>
> -  if (!MAY_HAVE_DEBUG_STMTS)
> +  if (!MAY_HAVE_DEBUG_BIND_STMTS)
>      return;
>
>    stmt = gsi_stmt (*gsi);
> @@ -521,7 +521,7 @@ reset_debug_uses (gimple *stmt)
>    imm_use_iterator imm_iter;
>    gimple *use_stmt;
>
> -  if (!MAY_HAVE_DEBUG_STMTS)
> +  if (!MAY_HAVE_DEBUG_BIND_STMTS)
>      return;
>
>    FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF)
> diff --git a/gcc/tree-ssanames.c b/gcc/tree-ssanames.c
> index 5c96075..4318adc 100644
> --- a/gcc/tree-ssanames.c
> +++ b/gcc/tree-ssanames.c
> @@ -562,7 +562,7 @@ release_ssa_name_fn (struct function *fn, tree var)
>        int saved_ssa_name_version = SSA_NAME_VERSION (var);
>        use_operand_p imm = &(SSA_NAME_IMM_USE_NODE (var));
>
> -      if (MAY_HAVE_DEBUG_STMTS)
> +      if (MAY_HAVE_DEBUG_BIND_STMTS)
>         insert_debug_temp_for_var_def (NULL, var);
>
>        if (flag_checking)
> diff --git a/gcc/tree-vect-loop-manip.c b/gcc/tree-vect-loop-manip.c
> index 5787d53..20d1962 100644
> --- a/gcc/tree-vect-loop-manip.c
> +++ b/gcc/tree-vect-loop-manip.c
> @@ -194,7 +194,7 @@ adjust_debug_stmts_now (adjust_info *ai)
>  static void
>  adjust_vec_debug_stmts (void)
>  {
> -  if (!MAY_HAVE_DEBUG_STMTS)
> +  if (!MAY_HAVE_DEBUG_BIND_STMTS)
>      return;
>
>    gcc_assert (adjust_vec.exists ());
> @@ -216,7 +216,7 @@ adjust_debug_stmts (tree from, tree to, basic_block bb)
>  {
>    adjust_info ai;
>
> -  if (MAY_HAVE_DEBUG_STMTS
> +  if (MAY_HAVE_DEBUG_BIND_STMTS
>        && TREE_CODE (from) == SSA_NAME
>        && ! SSA_NAME_IS_DEFAULT_DEF (from)
>        && ! virtual_operand_p (from))
> @@ -244,7 +244,7 @@ adjust_phi_and_debug_stmts (gimple *update_phi, edge e, tree new_def)
>
>    SET_PHI_ARG_DEF (update_phi, e->dest_idx, new_def);
>
> -  if (MAY_HAVE_DEBUG_STMTS)
> +  if (MAY_HAVE_DEBUG_BIND_STMTS)
>      adjust_debug_stmts (orig_def, PHI_RESULT (update_phi),
>                         gimple_bb (update_phi));
>  }
> @@ -1685,7 +1685,7 @@ vect_do_peeling (loop_vec_info loop_vinfo, tree niters, tree nitersm1,
>    create_lcssa_for_virtual_phi (loop);
>    update_ssa (TODO_update_ssa_only_virtuals);
>
> -  if (MAY_HAVE_DEBUG_STMTS)
> +  if (MAY_HAVE_DEBUG_BIND_STMTS)
>      {
>        gcc_assert (!adjust_vec.exists ());
>        adjust_vec.create (32);
> diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
> index bf49e26..07f666e 100644
> --- a/gcc/tree-vect-loop.c
> +++ b/gcc/tree-vect-loop.c
> @@ -7386,7 +7386,7 @@ vect_transform_loop (loop_vec_info loop_vinfo)
>           if (!stmt_info)
>             continue;
>
> -         if (MAY_HAVE_DEBUG_STMTS && !STMT_VINFO_LIVE_P (stmt_info))
> +         if (MAY_HAVE_DEBUG_BIND_STMTS && !STMT_VINFO_LIVE_P (stmt_info))
>             vect_loop_kill_debug_uses (loop, phi);
>
>           if (!STMT_VINFO_RELEVANT_P (stmt_info)
> @@ -7449,7 +7449,7 @@ vect_transform_loop (loop_vec_info loop_vinfo)
>               continue;
>             }
>
> -         if (MAY_HAVE_DEBUG_STMTS && !STMT_VINFO_LIVE_P (stmt_info))
> +         if (MAY_HAVE_DEBUG_BIND_STMTS && !STMT_VINFO_LIVE_P (stmt_info))
>             vect_loop_kill_debug_uses (loop, stmt);
>
>           if (!STMT_VINFO_RELEVANT_P (stmt_info)
> diff --git a/gcc/tree.h b/gcc/tree.h
> index caa4a69..2e8b3e9 100644
> --- a/gcc/tree.h
> +++ b/gcc/tree.h
> @@ -1126,8 +1126,14 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int,
>  #define VL_EXP_OPERAND_LENGTH(NODE) \
>    ((int)TREE_INT_CST_LOW (VL_EXP_CHECK (NODE)->exp.operands[0]))
>
> +/* Nonzero if gimple_debug_nonbind_marker_p() may possibly hold.  */
> +#define MAY_HAVE_DEBUG_MARKER_STMTS 0 /* debug_nonbind_markers_p */
> +/* Nonzero if gimple_debug_bind_p() (and thus
> +   gimple_debug_source_bind_p()) may possibly hold.  */
> +#define MAY_HAVE_DEBUG_BIND_STMTS flag_var_tracking_assignments
>  /* Nonzero if is_gimple_debug() may possibly hold.  */
> -#define MAY_HAVE_DEBUG_STMTS    (flag_var_tracking_assignments)
> +#define MAY_HAVE_DEBUG_STMTS                                   \
> +  (MAY_HAVE_DEBUG_MARKER_STMTS || MAY_HAVE_DEBUG_BIND_STMTS)
>
>  /* In a LOOP_EXPR node.  */
>  #define LOOP_EXPR_BODY(NODE) TREE_OPERAND_CHECK_CODE (NODE, LOOP_EXPR, 0)
> diff --git a/gcc/valtrack.c b/gcc/valtrack.c
> index 38af3f0..8d864c9 100644
> --- a/gcc/valtrack.c
> +++ b/gcc/valtrack.c
> @@ -211,7 +211,7 @@ propagate_for_debug (rtx_insn *insn, rtx_insn *last, rtx dest, rtx src,
>      {
>        insn = next;
>        next = NEXT_INSN (insn);
> -      if (DEBUG_INSN_P (insn))
> +      if (DEBUG_BIND_INSN_P (insn))
>         {
>           loc = simplify_replace_fn_rtx (INSN_VAR_LOCATION_LOC (insn),
>                                          dest, propagate_for_debug_subst, &p);
> diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c
> index 51e519a..43fc71a 100644
> --- a/gcc/var-tracking.c
> +++ b/gcc/var-tracking.c
> @@ -1118,7 +1118,7 @@ adjust_mems (rtx loc, const_rtx old_rtx, void *data)
>        if (tem == NULL_RTX)
>         tem = gen_rtx_raw_SUBREG (GET_MODE (loc), addr, SUBREG_BYTE (loc));
>      finish_subreg:
> -      if (MAY_HAVE_DEBUG_INSNS
> +      if (MAY_HAVE_DEBUG_BIND_INSNS
>           && GET_CODE (tem) == SUBREG
>           && (GET_CODE (SUBREG_REG (tem)) == PLUS
>               || GET_CODE (SUBREG_REG (tem)) == MINUS
> @@ -1330,7 +1330,7 @@ dv_onepart_p (decl_or_value dv)
>  {
>    tree decl;
>
> -  if (!MAY_HAVE_DEBUG_INSNS)
> +  if (!MAY_HAVE_DEBUG_BIND_INSNS)
>      return NOT_ONEPART;
>
>    if (dv_is_value_p (dv))
> @@ -4854,7 +4854,7 @@ dataflow_set_clear_at_call (dataflow_set *set, rtx_insn *call_insn)
>    EXECUTE_IF_SET_IN_HARD_REG_SET (invalidated_regs, 0, r, hrsi)
>      var_regno_delete (set, r);
>
> -  if (MAY_HAVE_DEBUG_INSNS)
> +  if (MAY_HAVE_DEBUG_BIND_INSNS)
>      {
>        set->traversed_vars = set->vars;
>        shared_hash_htab (set->vars)
> @@ -5528,7 +5528,7 @@ use_type (rtx loc, struct count_use_info *cui, machine_mode *modep)
>                   variable names such as VALUEs (never happens) or
>                   DEBUG_EXPRs (only happens in the presence of debug
>                   insns).  */
> -              && (!MAY_HAVE_DEBUG_INSNS
> +              && (!MAY_HAVE_DEBUG_BIND_INSNS
>                    || !rtx_debug_expr_p (XEXP (loc, 0))))
>         return MO_USE;
>        else
> @@ -6693,7 +6693,7 @@ compute_bb_dataflow (basic_block bb)
>    dataflow_set_copy (&old_out, out);
>    dataflow_set_copy (out, in);
>
> -  if (MAY_HAVE_DEBUG_INSNS)
> +  if (MAY_HAVE_DEBUG_BIND_INSNS)
>      local_get_addr_cache = new hash_map<rtx, rtx>;
>
>    FOR_EACH_VEC_ELT (VTI (bb)->mos, i, mo)
> @@ -6975,7 +6975,7 @@ compute_bb_dataflow (basic_block bb)
>         }
>      }
>
> -  if (MAY_HAVE_DEBUG_INSNS)
> +  if (MAY_HAVE_DEBUG_BIND_INSNS)
>      {
>        delete local_get_addr_cache;
>        local_get_addr_cache = NULL;
> @@ -7062,7 +7062,7 @@ vt_find_locations (void)
>               else
>                 oldinsz = oldoutsz = 0;
>
> -             if (MAY_HAVE_DEBUG_INSNS)
> +             if (MAY_HAVE_DEBUG_BIND_INSNS)
>                 {
>                   dataflow_set *in = &VTI (bb)->in, *first_out = NULL;
>                   bool first = true, adjust = false;
> @@ -7123,7 +7123,7 @@ vt_find_locations (void)
>
>               if (htabmax && htabsz > htabmax)
>                 {
> -                 if (MAY_HAVE_DEBUG_INSNS)
> +                 if (MAY_HAVE_DEBUG_BIND_INSNS)
>                     inform (DECL_SOURCE_LOCATION (cfun->decl),
>                             "variable tracking size limit exceeded with "
>                             "-fvar-tracking-assignments, retrying without");
> @@ -7183,7 +7183,7 @@ vt_find_locations (void)
>         }
>      }
>
> -  if (success && MAY_HAVE_DEBUG_INSNS)
> +  if (success && MAY_HAVE_DEBUG_BIND_INSNS)
>      FOR_EACH_BB_FN (bb, cfun)
>        gcc_assert (VTI (bb)->flooded);
>
> @@ -8572,7 +8572,7 @@ vt_expand_loc (rtx loc, variable_table_type *vars)
>    struct expand_loc_callback_data data;
>    rtx result;
>
> -  if (!MAY_HAVE_DEBUG_INSNS)
> +  if (!MAY_HAVE_DEBUG_BIND_INSNS)
>      return loc;
>
>    INIT_ELCD (data, vars);
> @@ -9007,7 +9007,7 @@ emit_notes_for_changes (rtx_insn *insn, enum emit_note_where where,
>    if (!changed_variables->elements ())
>      return;
>
> -  if (MAY_HAVE_DEBUG_INSNS)
> +  if (MAY_HAVE_DEBUG_BIND_INSNS)
>      process_changed_values (htab);
>
>    data.insn = insn;
> @@ -9491,10 +9491,8 @@ vt_emit_notes (void)
>       delete_variable_part).  */
>    emit_notes = true;
>
> -  if (MAY_HAVE_DEBUG_INSNS)
> -    {
> -      dropped_values = new variable_table_type (cselib_get_next_uid () * 2);
> -    }
> +  if (MAY_HAVE_DEBUG_BIND_INSNS)
> +    dropped_values = new variable_table_type (cselib_get_next_uid () * 2);
>
>    dataflow_set_init (&cur);
>
> @@ -9504,13 +9502,13 @@ vt_emit_notes (void)
>          subsequent basic blocks.  */
>        emit_notes_for_differences (BB_HEAD (bb), &cur, &VTI (bb)->in);
>
> -      if (MAY_HAVE_DEBUG_INSNS)
> +      if (MAY_HAVE_DEBUG_BIND_INSNS)
>         local_get_addr_cache = new hash_map<rtx, rtx>;
>
>        /* Emit the notes for the changes in the basic block itself.  */
>        emit_notes_in_bb (bb, &cur);
>
> -      if (MAY_HAVE_DEBUG_INSNS)
> +      if (MAY_HAVE_DEBUG_BIND_INSNS)
>         delete local_get_addr_cache;
>        local_get_addr_cache = NULL;
>
> @@ -9526,7 +9524,7 @@ vt_emit_notes (void)
>
>    dataflow_set_destroy (&cur);
>
> -  if (MAY_HAVE_DEBUG_INSNS)
> +  if (MAY_HAVE_DEBUG_BIND_INSNS)
>      delete dropped_values;
>    dropped_values = NULL;
>
> @@ -9886,7 +9884,7 @@ vt_init_cfa_base (void)
>        cfa_base_rtx = NULL_RTX;
>        return;
>      }
> -  if (!MAY_HAVE_DEBUG_INSNS)
> +  if (!MAY_HAVE_DEBUG_BIND_INSNS)
>      return;
>
>    /* Tell alias analysis that cfa_base_rtx should share
> @@ -9928,7 +9926,7 @@ vt_initialize (void)
>        VTI (bb)->permp = NULL;
>      }
>
> -  if (MAY_HAVE_DEBUG_INSNS)
> +  if (MAY_HAVE_DEBUG_BIND_INSNS)
>      {
>        cselib_init (CSELIB_RECORD_MEMORY | CSELIB_PRESERVE_CONSTANTS);
>        scratch_regs = BITMAP_ALLOC (NULL);
> @@ -9941,7 +9939,7 @@ vt_initialize (void)
>        global_get_addr_cache = NULL;
>      }
>
> -  if (MAY_HAVE_DEBUG_INSNS)
> +  if (MAY_HAVE_DEBUG_BIND_INSNS)
>      {
>        rtx reg, expr;
>        int ofst;
> @@ -10071,7 +10069,7 @@ vt_initialize (void)
>        HOST_WIDE_INT pre, post = 0;
>        basic_block first_bb, last_bb;
>
> -      if (MAY_HAVE_DEBUG_INSNS)
> +      if (MAY_HAVE_DEBUG_BIND_INSNS)
>         {
>           cselib_record_sets_hook = add_with_sets;
>           if (dump_file && (dump_flags & TDF_DETAILS))
> @@ -10122,7 +10120,7 @@ vt_initialize (void)
>
>                   cselib_hook_called = false;
>                   adjust_insn (bb, insn);
> -                 if (MAY_HAVE_DEBUG_INSNS)
> +                 if (MAY_HAVE_DEBUG_BIND_INSNS)
>                     {
>                       if (CALL_P (insn))
>                         prepare_call_arguments (bb, insn);
> @@ -10157,7 +10155,7 @@ vt_initialize (void)
>                       vt_init_cfa_base ();
>                       hard_frame_pointer_adjustment = fp_cfa_offset;
>                       /* Disassociate sp from fp now.  */
> -                     if (MAY_HAVE_DEBUG_INSNS)
> +                     if (MAY_HAVE_DEBUG_BIND_INSNS)
>                         {
>                           cselib_val *v;
>                           cselib_invalidate_rtx (stack_pointer_rtx);
> @@ -10177,7 +10175,7 @@ vt_initialize (void)
>
>        bb = last_bb;
>
> -      if (MAY_HAVE_DEBUG_INSNS)
> +      if (MAY_HAVE_DEBUG_BIND_INSNS)
>         {
>           cselib_preserve_only_values ();
>           cselib_reset_table (cselib_get_next_uid ());
> @@ -10276,7 +10274,7 @@ vt_finalize (void)
>    location_chain_pool.release ();
>    shared_hash_pool.release ();
>
> -  if (MAY_HAVE_DEBUG_INSNS)
> +  if (MAY_HAVE_DEBUG_BIND_INSNS)
>      {
>        if (global_get_addr_cache)
>         delete global_get_addr_cache;
> --
> 2.9.5
>
diff mbox series

Patch

diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
index bd3312e..cb866aa 100644
--- a/gcc/cfgexpand.c
+++ b/gcc/cfgexpand.c
@@ -5285,7 +5285,7 @@  expand_debug_locations (void)
   flag_strict_aliasing = 0;
 
   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
-    if (DEBUG_INSN_P (insn))
+    if (DEBUG_BIND_INSN_P (insn))
       {
 	tree value = (tree)INSN_VAR_LOCATION_LOC (insn);
 	rtx val;
@@ -5538,7 +5538,7 @@  expand_gimple_basic_block (basic_block bb, bool disable_tail_calls)
 	   a_2 = ...
            #DEBUG ... => #D1
 	 */
-      if (MAY_HAVE_DEBUG_INSNS
+      if (MAY_HAVE_DEBUG_BIND_INSNS
 	  && SA.values
 	  && !is_gimple_debug (stmt))
 	{
@@ -6165,7 +6165,7 @@  pass_expand::execute (function *fun)
   timevar_pop (TV_OUT_OF_SSA);
   SA.partition_to_pseudo = XCNEWVEC (rtx, SA.map->num_partitions);
 
-  if (MAY_HAVE_DEBUG_STMTS && flag_tree_ter)
+  if (MAY_HAVE_DEBUG_BIND_STMTS && flag_tree_ter)
     {
       gimple_stmt_iterator gsi;
       FOR_EACH_BB_FN (bb, cfun)
@@ -6356,7 +6356,7 @@  pass_expand::execute (function *fun)
 		  next_bb)
     bb = expand_gimple_basic_block (bb, var_ret_seq != NULL_RTX);
 
-  if (MAY_HAVE_DEBUG_INSNS)
+  if (MAY_HAVE_DEBUG_BIND_INSNS)
     expand_debug_locations ();
 
   if (deep_ter_debug_map)
diff --git a/gcc/cgraph.c b/gcc/cgraph.c
index 3d0cefb..cd60193 100644
--- a/gcc/cgraph.c
+++ b/gcc/cgraph.c
@@ -1459,7 +1459,7 @@  cgraph_edge::redirect_call_stmt_to_callee (void)
 	 stmts and associate D#X with parm in decl_debug_args_lookup
 	 vector to say for debug info that if parameter parm had been passed,
 	 it would have value parm_Y(D).  */
-      if (e->callee->clone.combined_args_to_skip && MAY_HAVE_DEBUG_STMTS)
+      if (e->callee->clone.combined_args_to_skip && MAY_HAVE_DEBUG_BIND_STMTS)
 	{
 	  vec<tree, va_gc> **debug_args
 	    = decl_debug_args_lookup (e->callee->decl);
diff --git a/gcc/combine.c b/gcc/combine.c
index e502fa1..86d710d 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -3726,7 +3726,7 @@  try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0,
 	  /* *SPLIT may be part of I2SRC, so make sure we have the
 	     original expression around for later debug processing.
 	     We should not need I2SRC any more in other cases.  */
-	  if (MAY_HAVE_DEBUG_INSNS)
+	  if (MAY_HAVE_DEBUG_BIND_INSNS)
 	    i2src = copy_rtx (i2src);
 	  else
 	    i2src = NULL;
@@ -4083,7 +4083,7 @@  try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0,
       return 0;
     }
 
-  if (MAY_HAVE_DEBUG_INSNS)
+  if (MAY_HAVE_DEBUG_BIND_INSNS)
     {
       struct undo *undo;
 
@@ -4396,7 +4396,7 @@  try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0,
 
     if (newi2pat)
       {
-	if (MAY_HAVE_DEBUG_INSNS && i2scratch)
+	if (MAY_HAVE_DEBUG_BIND_INSNS && i2scratch)
 	  propagate_for_debug (i2, last_combined_insn, i2dest, i2src,
 			       this_basic_block);
 	INSN_CODE (i2) = i2_code_number;
@@ -4404,7 +4404,7 @@  try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0,
       }
     else
       {
-	if (MAY_HAVE_DEBUG_INSNS && i2src)
+	if (MAY_HAVE_DEBUG_BIND_INSNS && i2src)
 	  propagate_for_debug (i2, last_combined_insn, i2dest, i2src,
 			       this_basic_block);
 	SET_INSN_DELETED (i2);
@@ -4414,7 +4414,7 @@  try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0,
       {
 	LOG_LINKS (i1) = NULL;
 	REG_NOTES (i1) = 0;
-	if (MAY_HAVE_DEBUG_INSNS)
+	if (MAY_HAVE_DEBUG_BIND_INSNS)
 	  propagate_for_debug (i1, last_combined_insn, i1dest, i1src,
 			       this_basic_block);
 	SET_INSN_DELETED (i1);
@@ -4424,7 +4424,7 @@  try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0,
       {
 	LOG_LINKS (i0) = NULL;
 	REG_NOTES (i0) = 0;
-	if (MAY_HAVE_DEBUG_INSNS)
+	if (MAY_HAVE_DEBUG_BIND_INSNS)
 	  propagate_for_debug (i0, last_combined_insn, i0dest, i0src,
 			       this_basic_block);
 	SET_INSN_DELETED (i0);
diff --git a/gcc/cse.c b/gcc/cse.c
index 672fd2e..d1577a6 100644
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -7054,11 +7054,11 @@  delete_trivially_dead_insns (rtx_insn *insns, int nreg)
 
   timevar_push (TV_DELETE_TRIVIALLY_DEAD);
   /* First count the number of times each register is used.  */
-  if (MAY_HAVE_DEBUG_INSNS)
+  if (MAY_HAVE_DEBUG_BIND_INSNS)
     {
       counts = XCNEWVEC (int, nreg * 3);
       for (insn = insns; insn; insn = NEXT_INSN (insn))
-	if (DEBUG_INSN_P (insn))
+	if (DEBUG_BIND_INSN_P (insn))
 	  count_reg_usage (INSN_VAR_LOCATION_LOC (insn), counts + nreg,
 			   NULL_RTX, 1);
 	else if (INSN_P (insn))
@@ -7116,12 +7116,15 @@  delete_trivially_dead_insns (rtx_insn *insns, int nreg)
       if (! live_insn && dbg_cnt (delete_trivial_dead))
 	{
 	  if (DEBUG_INSN_P (insn))
-	    count_reg_usage (INSN_VAR_LOCATION_LOC (insn), counts + nreg,
-			     NULL_RTX, -1);
+	    {
+	      if (DEBUG_BIND_INSN_P (insn))
+		count_reg_usage (INSN_VAR_LOCATION_LOC (insn), counts + nreg,
+				 NULL_RTX, -1);
+	    }
 	  else
 	    {
 	      rtx set;
-	      if (MAY_HAVE_DEBUG_INSNS
+	      if (MAY_HAVE_DEBUG_BIND_INSNS
 		  && (set = single_set (insn)) != NULL_RTX
 		  && is_dead_reg (SET_DEST (set), counts)
 		  /* Used at least once in some DEBUG_INSN.  */
@@ -7161,10 +7164,10 @@  delete_trivially_dead_insns (rtx_insn *insns, int nreg)
 	}
     }
 
-  if (MAY_HAVE_DEBUG_INSNS)
+  if (MAY_HAVE_DEBUG_BIND_INSNS)
     {
       for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
-	if (DEBUG_INSN_P (insn))
+	if (DEBUG_BIND_INSN_P (insn))
 	  {
 	    /* If this debug insn references a dead register that wasn't replaced
 	       with an DEBUG_EXPR, reset the DEBUG_INSN.  */
diff --git a/gcc/dce.c b/gcc/dce.c
index 7534d2a..6fd9548 100644
--- a/gcc/dce.c
+++ b/gcc/dce.c
@@ -777,7 +777,7 @@  rest_of_handle_ud_dce (void)
     }
   worklist.release ();
 
-  if (MAY_HAVE_DEBUG_INSNS)
+  if (MAY_HAVE_DEBUG_BIND_INSNS)
     reset_unmarked_insns_debug_uses ();
 
   /* Before any insns are deleted, we must remove the chains since
diff --git a/gcc/function.c b/gcc/function.c
index c03e2ac..ae61d3d 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -1951,10 +1951,11 @@  instantiate_virtual_regs (void)
 	   Fortunately, they shouldn't contain virtual registers either.  */
         if (GET_CODE (PATTERN (insn)) == USE
 	    || GET_CODE (PATTERN (insn)) == CLOBBER
-	    || GET_CODE (PATTERN (insn)) == ASM_INPUT)
+	    || GET_CODE (PATTERN (insn)) == ASM_INPUT
+	    || DEBUG_MARKER_INSN_P (insn))
 	  continue;
-	else if (DEBUG_INSN_P (insn))
-	  instantiate_virtual_regs_in_rtx (&INSN_VAR_LOCATION (insn));
+	else if (DEBUG_BIND_INSN_P (insn))
+	  instantiate_virtual_regs_in_rtx (INSN_VAR_LOCATION_PTR (insn));
 	else
 	  instantiate_virtual_regs_in_insn (insn);
 
diff --git a/gcc/gimple-ssa-backprop.c b/gcc/gimple-ssa-backprop.c
index f321ebb..b6e11c4 100644
--- a/gcc/gimple-ssa-backprop.c
+++ b/gcc/gimple-ssa-backprop.c
@@ -726,7 +726,7 @@  strip_sign_op (tree rhs)
 void
 backprop::prepare_change (tree var)
 {
-  if (MAY_HAVE_DEBUG_STMTS)
+  if (MAY_HAVE_DEBUG_BIND_STMTS)
     insert_debug_temp_for_var_def (NULL, var);
   reset_flow_sensitive_info (var);
 }
diff --git a/gcc/gimple.h b/gcc/gimple.h
index 6213c49..1783e11 100644
--- a/gcc/gimple.h
+++ b/gcc/gimple.h
@@ -198,13 +198,12 @@  enum gf_mask {
     GF_PREDICT_TAKEN		= 1 << 15
 };
 
-/* Currently, there are only two types of gimple debug stmt.  Others are
-   envisioned, for example, to enable the generation of is_stmt notes
-   in line number information, to mark sequence points, etc.  This
-   subcode is to be used to tell them apart.  */
+/* This subcode tells apart different kinds of stmts that are not used
+   for codegen, but rather to retain debug information.  */
 enum gimple_debug_subcode {
   GIMPLE_DEBUG_BIND = 0,
-  GIMPLE_DEBUG_SOURCE_BIND = 1
+  GIMPLE_DEBUG_SOURCE_BIND = 1,
+  GIMPLE_DEBUG_BEGIN_STMT = 2
 };
 
 /* Masks for selecting a pass local flag (PLF) to work on.  These
@@ -4739,6 +4738,28 @@  gimple_debug_source_bind_set_value (gimple *dbg, tree value)
   gimple_set_op (dbg, 1, value);
 }
 
+/* Return true if S is a GIMPLE_DEBUG BEGIN_STMT statement.  */
+
+static inline bool
+gimple_debug_begin_stmt_p (const gimple *s)
+{
+  if (is_gimple_debug (s))
+    return s->subcode == GIMPLE_DEBUG_BEGIN_STMT;
+
+  return false;
+}
+
+/* Return true if S is a GIMPLE_DEBUG non-binding marker statement.  */
+
+static inline bool
+gimple_debug_nonbind_marker_p (const gimple *s)
+{
+  if (is_gimple_debug (s))
+    return s->subcode == GIMPLE_DEBUG_BEGIN_STMT;
+
+  return false;
+}
+
 /* Return the line number for EXPR, or return -1 if we have no line
    number information for it.  */
 static inline int
diff --git a/gcc/haifa-sched.c b/gcc/haifa-sched.c
index 549e896..34cc46b 100644
--- a/gcc/haifa-sched.c
+++ b/gcc/haifa-sched.c
@@ -4010,7 +4010,7 @@  schedule_insn (rtx_insn *insn)
   gcc_assert (sd_lists_empty_p (insn, SD_LIST_HARD_BACK));
 
   /* Reset debug insns invalidated by moving this insn.  */
-  if (MAY_HAVE_DEBUG_INSNS && !DEBUG_INSN_P (insn))
+  if (MAY_HAVE_DEBUG_BIND_INSNS && !DEBUG_INSN_P (insn))
     for (sd_it = sd_iterator_start (insn, SD_LIST_BACK);
 	 sd_iterator_cond (&sd_it, &dep);)
       {
@@ -4023,7 +4023,7 @@  schedule_insn (rtx_insn *insn)
 	    continue;
 	  }
 
-	gcc_assert (DEBUG_INSN_P (dbg));
+	gcc_assert (DEBUG_BIND_INSN_P (dbg));
 
 	if (sched_verbose >= 6)
 	  fprintf (sched_dump, ";;\t\tresetting: debug insn %d\n",
diff --git a/gcc/insn-notes.def b/gcc/insn-notes.def
index f96ce18..960487b 100644
--- a/gcc/insn-notes.def
+++ b/gcc/insn-notes.def
@@ -68,6 +68,9 @@  INSN_NOTE (VAR_LOCATION)
 /* The values passed to callee.  */
 INSN_NOTE (CALL_ARG_LOCATION)
 
+/* The beginning of a statement.  */
+INSN_NOTE (BEGIN_STMT)
+
 /* Record the struct for the following basic block.  Uses
    NOTE_BASIC_BLOCK.  FIXME: Redundant with the basic block pointer
    now included in every insn.  NOTE: If there's no CFG anymore, in other words,
diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c
index 51f6221..2d15504 100644
--- a/gcc/ipa-prop.c
+++ b/gcc/ipa-prop.c
@@ -4410,7 +4410,7 @@  ipa_modify_call_arguments (struct cgraph_edge *cs, gcall *stmt,
 	    }
 	  vargs.quick_push (expr);
 	}
-      if (adj->op != IPA_PARM_OP_COPY && MAY_HAVE_DEBUG_STMTS)
+      if (adj->op != IPA_PARM_OP_COPY && MAY_HAVE_DEBUG_BIND_STMTS)
 	{
 	  unsigned int ix;
 	  tree ddecl = NULL_TREE, origin = DECL_ORIGIN (adj->base), arg;
diff --git a/gcc/ipa-split.c b/gcc/ipa-split.c
index e3759d6..d45e951 100644
--- a/gcc/ipa-split.c
+++ b/gcc/ipa-split.c
@@ -1471,7 +1471,7 @@  split_function (basic_block return_bb, struct split_point *split_point,
     {
       vec<tree, va_gc> **debug_args = NULL;
       unsigned i = 0, len = 0;
-      if (MAY_HAVE_DEBUG_STMTS)
+      if (MAY_HAVE_DEBUG_BIND_STMTS)
 	{
 	  debug_args = decl_debug_args_lookup (node->decl);
 	  if (debug_args)
@@ -1484,11 +1484,12 @@  split_function (basic_block return_bb, struct split_point *split_point,
 	    tree ddecl;
 	    gimple *def_temp;
 
-	    /* This needs to be done even without MAY_HAVE_DEBUG_STMTS,
-	       otherwise if it didn't exist before, we'd end up with
-	       different SSA_NAME_VERSIONs between -g and -g0.  */
+	    /* This needs to be done even without
+	       MAY_HAVE_DEBUG_BIND_STMTS, otherwise if it didn't exist
+	       before, we'd end up with different SSA_NAME_VERSIONs
+	       between -g and -g0.  */
 	    arg = get_or_create_ssa_default_def (cfun, parm);
-	    if (!MAY_HAVE_DEBUG_STMTS || debug_args == NULL)
+	    if (!MAY_HAVE_DEBUG_BIND_STMTS || debug_args == NULL)
 	      continue;
 
 	    while (i < len && (**debug_args)[i] != DECL_ORIGIN (parm))
diff --git a/gcc/ira.c b/gcc/ira.c
index 046ce3b..17f54a0 100644
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -3842,9 +3842,9 @@  combine_and_move_insns (void)
 	}
 
       /* Last pass - adjust debug insns referencing cleared regs.  */
-      if (MAY_HAVE_DEBUG_INSNS)
+      if (MAY_HAVE_DEBUG_BIND_INSNS)
 	for (rtx_insn *insn = get_insns (); insn; insn = NEXT_INSN (insn))
-	  if (DEBUG_INSN_P (insn))
+	  if (DEBUG_BIND_INSN_P (insn))
 	    {
 	      rtx old_loc = INSN_VAR_LOCATION_LOC (insn);
 	      INSN_VAR_LOCATION_LOC (insn)
diff --git a/gcc/loop-unroll.c b/gcc/loop-unroll.c
index 322f151..923be72 100644
--- a/gcc/loop-unroll.c
+++ b/gcc/loop-unroll.c
@@ -2026,12 +2026,14 @@  apply_opt_in_copies (struct opt_info *opt_info,
       FOR_BB_INSNS_SAFE (bb, insn, next)
         {
 	  if (!INSN_P (insn)
-	      || (DEBUG_INSN_P (insn)
+	      || (DEBUG_BIND_INSN_P (insn)
+		  && INSN_VAR_LOCATION_DECL (insn)
 		  && TREE_CODE (INSN_VAR_LOCATION_DECL (insn)) == LABEL_DECL))
             continue;
 
 	  while (!INSN_P (orig_insn)
-		 || (DEBUG_INSN_P (orig_insn)
+		 || (DEBUG_BIND_INSN_P (orig_insn)
+		     && INSN_VAR_LOCATION_DECL (orig_insn)
 		     && (TREE_CODE (INSN_VAR_LOCATION_DECL (orig_insn))
 			 == LABEL_DECL)))
             orig_insn = NEXT_INSN (orig_insn);
diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c
index f238106..e62ccda 100644
--- a/gcc/reg-stack.c
+++ b/gcc/reg-stack.c
@@ -3028,7 +3028,7 @@  convert_regs_1 (basic_block block)
 
       /* Don't bother processing unless there is a stack reg
 	 mentioned or if it's a CALL_INSN.  */
-      if (DEBUG_INSN_P (insn))
+      if (DEBUG_BIND_INSN_P (insn))
 	{
 	  if (starting_stack_p)
 	    debug_insns_with_starting_stack++;
@@ -3068,7 +3068,7 @@  convert_regs_1 (basic_block block)
       for (insn = BB_HEAD (block); debug_insns_with_starting_stack;
 	   insn = NEXT_INSN (insn))
 	{
-	  if (!DEBUG_INSN_P (insn))
+	  if (!DEBUG_BIND_INSN_P (insn))
 	    continue;
 
 	  debug_insns_with_starting_stack--;
diff --git a/gcc/regcprop.c b/gcc/regcprop.c
index 73e945d4..0ce64d7 100644
--- a/gcc/regcprop.c
+++ b/gcc/regcprop.c
@@ -757,7 +757,7 @@  copyprop_hardreg_forward_1 (basic_block bb, struct value_data *vd)
       next = NEXT_INSN (insn);
       if (!NONDEBUG_INSN_P (insn))
 	{
-	  if (DEBUG_INSN_P (insn))
+	  if (DEBUG_BIND_INSN_P (insn))
 	    {
 	      rtx loc = INSN_VAR_LOCATION_LOC (insn);
 	      if (!VAR_LOC_UNKNOWN_P (loc))
@@ -1302,7 +1302,7 @@  pass_cprop_hardreg::execute (function *fun)
       copyprop_hardreg_forward_1 (bb, all_vd + bb->index);
     }
 
-  if (MAY_HAVE_DEBUG_INSNS)
+  if (MAY_HAVE_DEBUG_BIND_INSNS)
     {
       FOR_EACH_BB_FN (bb, fun)
 	if (bitmap_bit_p (visited, bb->index)
diff --git a/gcc/regrename.c b/gcc/regrename.c
index 7fbfa31..89380a8 100644
--- a/gcc/regrename.c
+++ b/gcc/regrename.c
@@ -1876,7 +1876,7 @@  build_def_use (basic_block bb)
 	    if (REG_NOTE_KIND (note) == REG_CFA_RESTORE)
 	      scan_rtx (insn, &XEXP (note, 0), NO_REGS, mark_all_read, OP_IN);
 	}
-      else if (DEBUG_INSN_P (insn)
+      else if (DEBUG_BIND_INSN_P (insn)
 	       && !VAR_LOC_UNKNOWN_P (INSN_VAR_LOCATION_LOC (insn)))
 	{
 	  scan_rtx (insn, &INSN_VAR_LOCATION_LOC (insn),
diff --git a/gcc/regstat.c b/gcc/regstat.c
index 3fd26fd..fd3d3a8 100644
--- a/gcc/regstat.c
+++ b/gcc/regstat.c
@@ -54,7 +54,7 @@  regstat_init_n_sets_and_refs (void)
 
   regstat_n_sets_and_refs = XNEWVEC (struct regstat_n_sets_and_refs_t, max_regno);
 
-  if (MAY_HAVE_DEBUG_INSNS)
+  if (MAY_HAVE_DEBUG_BIND_INSNS)
     for (i = 0; i < max_regno; i++)
       {
 	int use_count;
diff --git a/gcc/reload1.c b/gcc/reload1.c
index 5e200b9..cf18b30 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -1112,7 +1112,7 @@  reload (rtx_insn *first, int global)
       /* We don't want complex addressing modes in debug insns
 	 if simpler ones will do, so delegitimize equivalences
 	 in debug insns.  */
-      if (MAY_HAVE_DEBUG_INSNS && reg_renumber[i] < 0)
+      if (MAY_HAVE_DEBUG_BIND_INSNS && reg_renumber[i] < 0)
 	{
 	  rtx reg = regno_reg_rtx[i];
 	  rtx equiv = 0;
@@ -1140,7 +1140,7 @@  reload (rtx_insn *first, int global)
 	      while (next && DF_REF_INSN (next) == insn)
 		next = DF_REF_NEXT_REG (next);
 
-	      if (DEBUG_INSN_P (insn))
+	      if (DEBUG_BIND_INSN_P (insn))
 		{
 		  if (!equiv)
 		    {
diff --git a/gcc/rtl.h b/gcc/rtl.h
index 3bda77c..c79a277 100644
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -815,8 +815,13 @@  struct GTY(()) rtvec_def {
 /* Predicate yielding nonzero iff X is an insn that is not a debug insn.  */
 #define NONDEBUG_INSN_P(X) (INSN_P (X) && !DEBUG_INSN_P (X))
 
+/* Nonzero if DEBUG_MARKER_INSN_P may possibly hold.  */
+#define MAY_HAVE_DEBUG_MARKER_INSNS 0 /* debug_nonbind_markers_p */
+/* Nonzero if DEBUG_BIND_INSN_P may possibly hold.  */
+#define MAY_HAVE_DEBUG_BIND_INSNS flag_var_tracking_assignments
 /* Nonzero if DEBUG_INSN_P may possibly hold.  */
-#define MAY_HAVE_DEBUG_INSNS (flag_var_tracking_assignments)
+#define MAY_HAVE_DEBUG_INSNS					\
+  (MAY_HAVE_DEBUG_MARKER_INSNS || MAY_HAVE_DEBUG_BIND_INSNS)
 
 /* Predicate yielding nonzero iff X is a real insn.  */
 #define INSN_P(X) \
@@ -1604,6 +1609,7 @@  extern const char * const reg_note_name[];
 #define NOTE_EH_HANDLER(INSN)	XCINT (INSN, 3, NOTE)
 #define NOTE_BASIC_BLOCK(INSN)	XCBBDEF (INSN, 3, NOTE)
 #define NOTE_VAR_LOCATION(INSN)	XCEXP (INSN, 3, NOTE)
+#define NOTE_MARKER_LOCATION(INSN) XCUINT (INSN, 3, NOTE)
 #define NOTE_CFI(INSN)		XCCFI (INSN, 3, NOTE)
 #define NOTE_LABEL_NUMBER(INSN)	XCINT (INSN, 3, NOTE)
 
@@ -1615,6 +1621,12 @@  extern const char * const reg_note_name[];
 #define NOTE_INSN_BASIC_BLOCK_P(INSN) \
   (NOTE_P (INSN) && NOTE_KIND (INSN) == NOTE_INSN_BASIC_BLOCK)
 
+/* Nonzero if INSN is a debug nonbind marker note,
+   for which NOTE_MARKER_LOCATION can be used.  */
+#define NOTE_MARKER_P(INSN)				\
+  (NOTE_P (INSN) &&					\
+   (NOTE_KIND (INSN) == NOTE_INSN_BEGIN_STMT))
+
 /* Variable declaration and the location of a variable.  */
 #define PAT_VAR_LOCATION_DECL(PAT) (XCTREE ((PAT), 0, VAR_LOCATION))
 #define PAT_VAR_LOCATION_LOC(PAT) (XCEXP ((PAT), 1, VAR_LOCATION))
@@ -1634,8 +1646,32 @@  extern const char * const reg_note_name[];
 #define NOTE_VAR_LOCATION_STATUS(NOTE) \
   PAT_VAR_LOCATION_STATUS (NOTE_VAR_LOCATION (NOTE))
 
+/* Evaluate to TRUE if INSN is a debug insn that denotes a variable
+   location/value tracking annotation.  */
+#define DEBUG_BIND_INSN_P(INSN)			\
+  (DEBUG_INSN_P (INSN)				\
+   && (GET_CODE (PATTERN (INSN))		\
+       == VAR_LOCATION))
+/* Evaluate to TRUE if INSN is a debug insn that denotes a program
+   source location marker.  */
+#define DEBUG_MARKER_INSN_P(INSN)		\
+  (DEBUG_INSN_P (INSN)				\
+   && (GET_CODE (PATTERN (INSN))		\
+       != VAR_LOCATION))
+/* Evaluate to the marker kind.  */
+#define INSN_DEBUG_MARKER_KIND(INSN)		  \
+  (GET_CODE (PATTERN (INSN)) == DEBUG_MARKER	  \
+   ? (GET_MODE (PATTERN (INSN)) == VOIDmode	  \
+      ? NOTE_INSN_BEGIN_STMT			  \
+      : (enum insn_note)-1) 			  \
+   : (enum insn_note)-1)
+
 /* The VAR_LOCATION rtx in a DEBUG_INSN.  */
-#define INSN_VAR_LOCATION(INSN) PATTERN (INSN)
+#define INSN_VAR_LOCATION(INSN) \
+  (RTL_FLAG_CHECK1 ("INSN_VAR_LOCATION", PATTERN (INSN), VAR_LOCATION))
+/* A pointer to the VAR_LOCATION rtx in a DEBUG_INSN.  */
+#define INSN_VAR_LOCATION_PTR(INSN) \
+  (&PATTERN (INSN))
 
 /* Accessors for a tree-expanded var location debug insn.  */
 #define INSN_VAR_LOCATION_DECL(INSN) \
diff --git a/gcc/sese.c b/gcc/sese.c
index ad85aa4..a24688f 100644
--- a/gcc/sese.c
+++ b/gcc/sese.c
@@ -164,7 +164,7 @@  sese_build_liveouts (sese_info_p region, bitmap liveouts)
       sese_build_liveouts_bb (region, liveouts, bb);
 
   /* FIXME: We could start iterating form the successor of sese.  */
-  if (MAY_HAVE_DEBUG_STMTS)
+  if (MAY_HAVE_DEBUG_BIND_STMTS)
     FOR_EACH_BB_FN (bb, cfun)
       if (!bb_in_sese_p (bb, region->region))
 	sese_reset_debug_liveouts_bb (region, liveouts, bb);
diff --git a/gcc/shrink-wrap.c b/gcc/shrink-wrap.c
index 3cad776..85fe81d 100644
--- a/gcc/shrink-wrap.c
+++ b/gcc/shrink-wrap.c
@@ -309,10 +309,10 @@  move_insn_for_shrink_wrap (basic_block bb, rtx_insn *insn,
      move it as far as we can.  */
   do
     {
-      if (MAY_HAVE_DEBUG_INSNS)
+      if (MAY_HAVE_DEBUG_BIND_INSNS)
 	{
 	  FOR_BB_INSNS_REVERSE (bb, dinsn)
-	    if (DEBUG_INSN_P (dinsn))
+	    if (DEBUG_BIND_INSN_P (dinsn))
 	      {
 		df_ref use;
 		FOR_EACH_INSN_USE (use, dinsn)
diff --git a/gcc/ssa-iterators.h b/gcc/ssa-iterators.h
index c8aa77b..dca0439 100644
--- a/gcc/ssa-iterators.h
+++ b/gcc/ssa-iterators.h
@@ -447,7 +447,7 @@  num_imm_uses (const_tree var)
   const ssa_use_operand_t *ptr;
   unsigned int num = 0;
 
-  if (!MAY_HAVE_DEBUG_STMTS)
+  if (!MAY_HAVE_DEBUG_BIND_STMTS)
     {
       for (ptr = start->next; ptr != start; ptr = ptr->next)
 	if (USE_STMT (ptr))
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index 99d1f1e..dc9ce3c 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -2054,7 +2054,7 @@  gimple_merge_blocks (basic_block a, basic_block b)
 	      gsi_insert_before (&dest_gsi, stmt, GSI_NEW_STMT);
 	    }
 	  /* Other user labels keep around in a form of a debug stmt.  */
-	  else if (!DECL_ARTIFICIAL (label) && MAY_HAVE_DEBUG_STMTS)
+	  else if (!DECL_ARTIFICIAL (label) && MAY_HAVE_DEBUG_BIND_STMTS)
 	    {
 	      gimple *dbg = gimple_build_debug_bind (label,
 						     integer_zero_node,
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index a226096..a142488 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -6032,7 +6032,7 @@  tree_function_versioning (tree old_decl, tree new_decl,
 					    &vars);
 		if (init)
 		  init_stmts.safe_push (init);
-		if (MAY_HAVE_DEBUG_STMTS && args_to_skip)
+		if (MAY_HAVE_DEBUG_BIND_STMTS && args_to_skip)
 		  {
 		    if (parm_num == -1)
 		      {
@@ -6178,7 +6178,7 @@  tree_function_versioning (tree old_decl, tree new_decl,
 	}
     }
 
-  if (debug_args_to_skip && MAY_HAVE_DEBUG_STMTS)
+  if (debug_args_to_skip && MAY_HAVE_DEBUG_BIND_STMTS)
     {
       tree parm;
       vec<tree, va_gc> **debug_args = NULL;
diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c
index 26b8b9a..65ccd71 100644
--- a/gcc/tree-loop-distribution.c
+++ b/gcc/tree-loop-distribution.c
@@ -807,7 +807,7 @@  generate_loops_for_partition (struct loop *loop, partition *partition,
   /* Remove stmts not in the PARTITION bitmap.  */
   bbs = get_loop_body_in_dom_order (loop);
 
-  if (MAY_HAVE_DEBUG_STMTS)
+  if (MAY_HAVE_DEBUG_BIND_STMTS)
     for (i = 0; i < loop->num_nodes; i++)
       {
 	basic_block bb = bbs[i];
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index f5675ed..e7167e7 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -2477,7 +2477,7 @@  analyze_access_subtree (struct access *root, struct access *parent,
 	  gcc_checking_assert (!root->grp_scalar_read
 			       && !root->grp_assignment_read);
 	  sth_created = true;
-	  if (MAY_HAVE_DEBUG_STMTS)
+	  if (MAY_HAVE_DEBUG_BIND_STMTS)
 	    {
 	      root->grp_to_be_debug_replaced = 1;
 	      root->replacement_decl = create_access_replacement (root);
diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c
index e62afad..f60670f 100644
--- a/gcc/tree-ssa-dce.c
+++ b/gcc/tree-ssa-dce.c
@@ -1086,7 +1086,7 @@  remove_dead_stmt (gimple_stmt_iterator *i, basic_block bb)
 
   /* If this is a store into a variable that is being optimized away,
      add a debug bind stmt if possible.  */
-  if (MAY_HAVE_DEBUG_STMTS
+  if (MAY_HAVE_DEBUG_BIND_STMTS
       && gimple_assign_single_p (stmt)
       && is_gimple_val (gimple_assign_rhs1 (stmt)))
     {
diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c
index bbea619..f8fe317 100644
--- a/gcc/tree-ssa-loop-ivopts.c
+++ b/gcc/tree-ssa-loop-ivopts.c
@@ -7148,7 +7148,7 @@  remove_unused_ivs (struct ivopts_data *data)
 
 	  tree def = info->iv->ssa_name;
 
-	  if (MAY_HAVE_DEBUG_STMTS && SSA_NAME_DEF_STMT (def))
+	  if (MAY_HAVE_DEBUG_BIND_STMTS && SSA_NAME_DEF_STMT (def))
 	    {
 	      imm_use_iterator imm_iter;
 	      use_operand_p use_p;
diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c
index b2d0f57..a671a16 100644
--- a/gcc/tree-ssa-reassoc.c
+++ b/gcc/tree-ssa-reassoc.c
@@ -232,7 +232,7 @@  reassoc_remove_stmt (gimple_stmt_iterator *gsi)
 {
   gimple *stmt = gsi_stmt (*gsi);
 
-  if (!MAY_HAVE_DEBUG_STMTS || gimple_code (stmt) == GIMPLE_PHI)
+  if (!MAY_HAVE_DEBUG_BIND_STMTS || gimple_code (stmt) == GIMPLE_PHI)
     return gsi_remove (gsi, true);
 
   gimple_stmt_iterator prev = *gsi;
diff --git a/gcc/tree-ssa-tail-merge.c b/gcc/tree-ssa-tail-merge.c
index a65ff31..a3d5074 100644
--- a/gcc/tree-ssa-tail-merge.c
+++ b/gcc/tree-ssa-tail-merge.c
@@ -1802,7 +1802,7 @@  tail_merge_optimize (unsigned int todo)
 
   if (nr_bbs_removed_total > 0)
     {
-      if (MAY_HAVE_DEBUG_STMTS)
+      if (MAY_HAVE_DEBUG_BIND_STMTS)
 	{
 	  calculate_dominance_info (CDI_DOMINATORS);
 	  update_debug_stmts ();
diff --git a/gcc/tree-ssa-threadedge.c b/gcc/tree-ssa-threadedge.c
index 536c471..70675e4 100644
--- a/gcc/tree-ssa-threadedge.c
+++ b/gcc/tree-ssa-threadedge.c
@@ -692,7 +692,7 @@  simplify_control_stmt_condition_1 (edge e,
 void
 propagate_threaded_block_debug_into (basic_block dest, basic_block src)
 {
-  if (!MAY_HAVE_DEBUG_STMTS)
+  if (!MAY_HAVE_DEBUG_BIND_STMTS)
     return;
 
   if (!single_pred_p (dest))
diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c
index 8b6da96..151f544 100644
--- a/gcc/tree-ssa.c
+++ b/gcc/tree-ssa.c
@@ -220,7 +220,7 @@  flush_pending_stmts (edge e)
 void
 gimple_replace_ssa_lhs (gimple *stmt, tree nlhs)
 {
-  if (MAY_HAVE_DEBUG_STMTS)
+  if (MAY_HAVE_DEBUG_BIND_STMTS)
     {
       tree lhs = gimple_get_lhs (stmt);
 
@@ -242,7 +242,7 @@  gimple_replace_ssa_lhs (gimple *stmt, tree nlhs)
 tree
 target_for_debug_bind (tree var)
 {
-  if (!MAY_HAVE_DEBUG_STMTS)
+  if (!MAY_HAVE_DEBUG_BIND_STMTS)
     return NULL_TREE;
 
   if (TREE_CODE (var) == SSA_NAME)
@@ -307,7 +307,7 @@  insert_debug_temp_for_var_def (gimple_stmt_iterator *gsi, tree var)
   int usecount = 0;
   tree value = NULL;
 
-  if (!MAY_HAVE_DEBUG_STMTS)
+  if (!MAY_HAVE_DEBUG_BIND_STMTS)
     return;
 
   /* If this name has already been registered for replacement, do nothing
@@ -495,7 +495,7 @@  insert_debug_temps_for_defs (gimple_stmt_iterator *gsi)
   ssa_op_iter op_iter;
   def_operand_p def_p;
 
-  if (!MAY_HAVE_DEBUG_STMTS)
+  if (!MAY_HAVE_DEBUG_BIND_STMTS)
     return;
 
   stmt = gsi_stmt (*gsi);
@@ -521,7 +521,7 @@  reset_debug_uses (gimple *stmt)
   imm_use_iterator imm_iter;
   gimple *use_stmt;
 
-  if (!MAY_HAVE_DEBUG_STMTS)
+  if (!MAY_HAVE_DEBUG_BIND_STMTS)
     return;
 
   FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF)
diff --git a/gcc/tree-ssanames.c b/gcc/tree-ssanames.c
index 5c96075..4318adc 100644
--- a/gcc/tree-ssanames.c
+++ b/gcc/tree-ssanames.c
@@ -562,7 +562,7 @@  release_ssa_name_fn (struct function *fn, tree var)
       int saved_ssa_name_version = SSA_NAME_VERSION (var);
       use_operand_p imm = &(SSA_NAME_IMM_USE_NODE (var));
 
-      if (MAY_HAVE_DEBUG_STMTS)
+      if (MAY_HAVE_DEBUG_BIND_STMTS)
 	insert_debug_temp_for_var_def (NULL, var);
 
       if (flag_checking)
diff --git a/gcc/tree-vect-loop-manip.c b/gcc/tree-vect-loop-manip.c
index 5787d53..20d1962 100644
--- a/gcc/tree-vect-loop-manip.c
+++ b/gcc/tree-vect-loop-manip.c
@@ -194,7 +194,7 @@  adjust_debug_stmts_now (adjust_info *ai)
 static void
 adjust_vec_debug_stmts (void)
 {
-  if (!MAY_HAVE_DEBUG_STMTS)
+  if (!MAY_HAVE_DEBUG_BIND_STMTS)
     return;
 
   gcc_assert (adjust_vec.exists ());
@@ -216,7 +216,7 @@  adjust_debug_stmts (tree from, tree to, basic_block bb)
 {
   adjust_info ai;
 
-  if (MAY_HAVE_DEBUG_STMTS
+  if (MAY_HAVE_DEBUG_BIND_STMTS
       && TREE_CODE (from) == SSA_NAME
       && ! SSA_NAME_IS_DEFAULT_DEF (from)
       && ! virtual_operand_p (from))
@@ -244,7 +244,7 @@  adjust_phi_and_debug_stmts (gimple *update_phi, edge e, tree new_def)
 
   SET_PHI_ARG_DEF (update_phi, e->dest_idx, new_def);
 
-  if (MAY_HAVE_DEBUG_STMTS)
+  if (MAY_HAVE_DEBUG_BIND_STMTS)
     adjust_debug_stmts (orig_def, PHI_RESULT (update_phi),
 			gimple_bb (update_phi));
 }
@@ -1685,7 +1685,7 @@  vect_do_peeling (loop_vec_info loop_vinfo, tree niters, tree nitersm1,
   create_lcssa_for_virtual_phi (loop);
   update_ssa (TODO_update_ssa_only_virtuals);
 
-  if (MAY_HAVE_DEBUG_STMTS)
+  if (MAY_HAVE_DEBUG_BIND_STMTS)
     {
       gcc_assert (!adjust_vec.exists ());
       adjust_vec.create (32);
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index bf49e26..07f666e 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -7386,7 +7386,7 @@  vect_transform_loop (loop_vec_info loop_vinfo)
 	  if (!stmt_info)
 	    continue;
 
-	  if (MAY_HAVE_DEBUG_STMTS && !STMT_VINFO_LIVE_P (stmt_info))
+	  if (MAY_HAVE_DEBUG_BIND_STMTS && !STMT_VINFO_LIVE_P (stmt_info))
 	    vect_loop_kill_debug_uses (loop, phi);
 
 	  if (!STMT_VINFO_RELEVANT_P (stmt_info)
@@ -7449,7 +7449,7 @@  vect_transform_loop (loop_vec_info loop_vinfo)
 	      continue;
 	    }
 
-	  if (MAY_HAVE_DEBUG_STMTS && !STMT_VINFO_LIVE_P (stmt_info))
+	  if (MAY_HAVE_DEBUG_BIND_STMTS && !STMT_VINFO_LIVE_P (stmt_info))
 	    vect_loop_kill_debug_uses (loop, stmt);
 
 	  if (!STMT_VINFO_RELEVANT_P (stmt_info)
diff --git a/gcc/tree.h b/gcc/tree.h
index caa4a69..2e8b3e9 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -1126,8 +1126,14 @@  extern void omp_clause_range_check_failed (const_tree, const char *, int,
 #define VL_EXP_OPERAND_LENGTH(NODE) \
   ((int)TREE_INT_CST_LOW (VL_EXP_CHECK (NODE)->exp.operands[0]))
 
+/* Nonzero if gimple_debug_nonbind_marker_p() may possibly hold.  */
+#define MAY_HAVE_DEBUG_MARKER_STMTS 0 /* debug_nonbind_markers_p */
+/* Nonzero if gimple_debug_bind_p() (and thus
+   gimple_debug_source_bind_p()) may possibly hold.  */
+#define MAY_HAVE_DEBUG_BIND_STMTS flag_var_tracking_assignments
 /* Nonzero if is_gimple_debug() may possibly hold.  */
-#define MAY_HAVE_DEBUG_STMTS    (flag_var_tracking_assignments)
+#define MAY_HAVE_DEBUG_STMTS					\
+  (MAY_HAVE_DEBUG_MARKER_STMTS || MAY_HAVE_DEBUG_BIND_STMTS)
 
 /* In a LOOP_EXPR node.  */
 #define LOOP_EXPR_BODY(NODE) TREE_OPERAND_CHECK_CODE (NODE, LOOP_EXPR, 0)
diff --git a/gcc/valtrack.c b/gcc/valtrack.c
index 38af3f0..8d864c9 100644
--- a/gcc/valtrack.c
+++ b/gcc/valtrack.c
@@ -211,7 +211,7 @@  propagate_for_debug (rtx_insn *insn, rtx_insn *last, rtx dest, rtx src,
     {
       insn = next;
       next = NEXT_INSN (insn);
-      if (DEBUG_INSN_P (insn))
+      if (DEBUG_BIND_INSN_P (insn))
 	{
 	  loc = simplify_replace_fn_rtx (INSN_VAR_LOCATION_LOC (insn),
 					 dest, propagate_for_debug_subst, &p);
diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c
index 51e519a..43fc71a 100644
--- a/gcc/var-tracking.c
+++ b/gcc/var-tracking.c
@@ -1118,7 +1118,7 @@  adjust_mems (rtx loc, const_rtx old_rtx, void *data)
       if (tem == NULL_RTX)
 	tem = gen_rtx_raw_SUBREG (GET_MODE (loc), addr, SUBREG_BYTE (loc));
     finish_subreg:
-      if (MAY_HAVE_DEBUG_INSNS
+      if (MAY_HAVE_DEBUG_BIND_INSNS
 	  && GET_CODE (tem) == SUBREG
 	  && (GET_CODE (SUBREG_REG (tem)) == PLUS
 	      || GET_CODE (SUBREG_REG (tem)) == MINUS
@@ -1330,7 +1330,7 @@  dv_onepart_p (decl_or_value dv)
 {
   tree decl;
 
-  if (!MAY_HAVE_DEBUG_INSNS)
+  if (!MAY_HAVE_DEBUG_BIND_INSNS)
     return NOT_ONEPART;
 
   if (dv_is_value_p (dv))
@@ -4854,7 +4854,7 @@  dataflow_set_clear_at_call (dataflow_set *set, rtx_insn *call_insn)
   EXECUTE_IF_SET_IN_HARD_REG_SET (invalidated_regs, 0, r, hrsi)
     var_regno_delete (set, r);
 
-  if (MAY_HAVE_DEBUG_INSNS)
+  if (MAY_HAVE_DEBUG_BIND_INSNS)
     {
       set->traversed_vars = set->vars;
       shared_hash_htab (set->vars)
@@ -5528,7 +5528,7 @@  use_type (rtx loc, struct count_use_info *cui, machine_mode *modep)
 		  variable names such as VALUEs (never happens) or
 		  DEBUG_EXPRs (only happens in the presence of debug
 		  insns).  */
-	       && (!MAY_HAVE_DEBUG_INSNS
+	       && (!MAY_HAVE_DEBUG_BIND_INSNS
 		   || !rtx_debug_expr_p (XEXP (loc, 0))))
 	return MO_USE;
       else
@@ -6693,7 +6693,7 @@  compute_bb_dataflow (basic_block bb)
   dataflow_set_copy (&old_out, out);
   dataflow_set_copy (out, in);
 
-  if (MAY_HAVE_DEBUG_INSNS)
+  if (MAY_HAVE_DEBUG_BIND_INSNS)
     local_get_addr_cache = new hash_map<rtx, rtx>;
 
   FOR_EACH_VEC_ELT (VTI (bb)->mos, i, mo)
@@ -6975,7 +6975,7 @@  compute_bb_dataflow (basic_block bb)
 	}
     }
 
-  if (MAY_HAVE_DEBUG_INSNS)
+  if (MAY_HAVE_DEBUG_BIND_INSNS)
     {
       delete local_get_addr_cache;
       local_get_addr_cache = NULL;
@@ -7062,7 +7062,7 @@  vt_find_locations (void)
 	      else
 		oldinsz = oldoutsz = 0;
 
-	      if (MAY_HAVE_DEBUG_INSNS)
+	      if (MAY_HAVE_DEBUG_BIND_INSNS)
 		{
 		  dataflow_set *in = &VTI (bb)->in, *first_out = NULL;
 		  bool first = true, adjust = false;
@@ -7123,7 +7123,7 @@  vt_find_locations (void)
 
 	      if (htabmax && htabsz > htabmax)
 		{
-		  if (MAY_HAVE_DEBUG_INSNS)
+		  if (MAY_HAVE_DEBUG_BIND_INSNS)
 		    inform (DECL_SOURCE_LOCATION (cfun->decl),
 			    "variable tracking size limit exceeded with "
 			    "-fvar-tracking-assignments, retrying without");
@@ -7183,7 +7183,7 @@  vt_find_locations (void)
 	}
     }
 
-  if (success && MAY_HAVE_DEBUG_INSNS)
+  if (success && MAY_HAVE_DEBUG_BIND_INSNS)
     FOR_EACH_BB_FN (bb, cfun)
       gcc_assert (VTI (bb)->flooded);
 
@@ -8572,7 +8572,7 @@  vt_expand_loc (rtx loc, variable_table_type *vars)
   struct expand_loc_callback_data data;
   rtx result;
 
-  if (!MAY_HAVE_DEBUG_INSNS)
+  if (!MAY_HAVE_DEBUG_BIND_INSNS)
     return loc;
 
   INIT_ELCD (data, vars);
@@ -9007,7 +9007,7 @@  emit_notes_for_changes (rtx_insn *insn, enum emit_note_where where,
   if (!changed_variables->elements ())
     return;
 
-  if (MAY_HAVE_DEBUG_INSNS)
+  if (MAY_HAVE_DEBUG_BIND_INSNS)
     process_changed_values (htab);
 
   data.insn = insn;
@@ -9491,10 +9491,8 @@  vt_emit_notes (void)
      delete_variable_part).  */
   emit_notes = true;
 
-  if (MAY_HAVE_DEBUG_INSNS)
-    {
-      dropped_values = new variable_table_type (cselib_get_next_uid () * 2);
-    }
+  if (MAY_HAVE_DEBUG_BIND_INSNS)
+    dropped_values = new variable_table_type (cselib_get_next_uid () * 2);
 
   dataflow_set_init (&cur);
 
@@ -9504,13 +9502,13 @@  vt_emit_notes (void)
 	 subsequent basic blocks.  */
       emit_notes_for_differences (BB_HEAD (bb), &cur, &VTI (bb)->in);
 
-      if (MAY_HAVE_DEBUG_INSNS)
+      if (MAY_HAVE_DEBUG_BIND_INSNS)
 	local_get_addr_cache = new hash_map<rtx, rtx>;
 
       /* Emit the notes for the changes in the basic block itself.  */
       emit_notes_in_bb (bb, &cur);
 
-      if (MAY_HAVE_DEBUG_INSNS)
+      if (MAY_HAVE_DEBUG_BIND_INSNS)
 	delete local_get_addr_cache;
       local_get_addr_cache = NULL;
 
@@ -9526,7 +9524,7 @@  vt_emit_notes (void)
 
   dataflow_set_destroy (&cur);
 
-  if (MAY_HAVE_DEBUG_INSNS)
+  if (MAY_HAVE_DEBUG_BIND_INSNS)
     delete dropped_values;
   dropped_values = NULL;
 
@@ -9886,7 +9884,7 @@  vt_init_cfa_base (void)
       cfa_base_rtx = NULL_RTX;
       return;
     }
-  if (!MAY_HAVE_DEBUG_INSNS)
+  if (!MAY_HAVE_DEBUG_BIND_INSNS)
     return;
 
   /* Tell alias analysis that cfa_base_rtx should share
@@ -9928,7 +9926,7 @@  vt_initialize (void)
       VTI (bb)->permp = NULL;
     }
 
-  if (MAY_HAVE_DEBUG_INSNS)
+  if (MAY_HAVE_DEBUG_BIND_INSNS)
     {
       cselib_init (CSELIB_RECORD_MEMORY | CSELIB_PRESERVE_CONSTANTS);
       scratch_regs = BITMAP_ALLOC (NULL);
@@ -9941,7 +9939,7 @@  vt_initialize (void)
       global_get_addr_cache = NULL;
     }
 
-  if (MAY_HAVE_DEBUG_INSNS)
+  if (MAY_HAVE_DEBUG_BIND_INSNS)
     {
       rtx reg, expr;
       int ofst;
@@ -10071,7 +10069,7 @@  vt_initialize (void)
       HOST_WIDE_INT pre, post = 0;
       basic_block first_bb, last_bb;
 
-      if (MAY_HAVE_DEBUG_INSNS)
+      if (MAY_HAVE_DEBUG_BIND_INSNS)
 	{
 	  cselib_record_sets_hook = add_with_sets;
 	  if (dump_file && (dump_flags & TDF_DETAILS))
@@ -10122,7 +10120,7 @@  vt_initialize (void)
 
 		  cselib_hook_called = false;
 		  adjust_insn (bb, insn);
-		  if (MAY_HAVE_DEBUG_INSNS)
+		  if (MAY_HAVE_DEBUG_BIND_INSNS)
 		    {
 		      if (CALL_P (insn))
 			prepare_call_arguments (bb, insn);
@@ -10157,7 +10155,7 @@  vt_initialize (void)
 		      vt_init_cfa_base ();
 		      hard_frame_pointer_adjustment = fp_cfa_offset;
 		      /* Disassociate sp from fp now.  */
-		      if (MAY_HAVE_DEBUG_INSNS)
+		      if (MAY_HAVE_DEBUG_BIND_INSNS)
 			{
 			  cselib_val *v;
 			  cselib_invalidate_rtx (stack_pointer_rtx);
@@ -10177,7 +10175,7 @@  vt_initialize (void)
 
       bb = last_bb;
 
-      if (MAY_HAVE_DEBUG_INSNS)
+      if (MAY_HAVE_DEBUG_BIND_INSNS)
 	{
 	  cselib_preserve_only_values ();
 	  cselib_reset_table (cselib_get_next_uid ());
@@ -10276,7 +10274,7 @@  vt_finalize (void)
   location_chain_pool.release ();
   shared_hash_pool.release ();
 
-  if (MAY_HAVE_DEBUG_INSNS)
+  if (MAY_HAVE_DEBUG_BIND_INSNS)
     {
       if (global_get_addr_cache)
 	delete global_get_addr_cache;