diff options
author | David Malcolm <dmalcolm@redhat.com> | 2014-08-28 19:03:22 +0000 |
---|---|---|
committer | David Malcolm <dmalcolm@gcc.gnu.org> | 2014-08-28 19:03:22 +0000 |
commit | b5241a5a9c5e34639b97aa3d488f021d96eafb4d (patch) | |
tree | 0fe8976b1ef9952f3ce44fb0045368039460da52 /gcc/rtlanal.c | |
parent | f48bd60e3a778f262e0ac26b9678ab60012fb780 (diff) | |
download | gcc-b5241a5a9c5e34639b97aa3d488f021d96eafb4d.zip gcc-b5241a5a9c5e34639b97aa3d488f021d96eafb4d.tar.gz gcc-b5241a5a9c5e34639b97aa3d488f021d96eafb4d.tar.bz2 |
Convert nonlocal_goto_handler_labels from an EXPR_LIST to an INSN_LIST
gcc/
2014-08-28 David Malcolm <dmalcolm@redhat.com>
* function.h (struct rtl_data): Convert field
"x_nonlocal_goto_handler_labels" from rtx_expr_list * to
rtx_insn_list *.
* rtl.h (remove_node_from_insn_list): New prototype.
* builtins.c (expand_builtin): When prepending to
nonlocal_goto_handler_labels, use gen_rtx_INSN_LIST rather than
gen_rtx_EXPR_LIST.
* cfgbuild.c (make_edges): Convert local "x" from rtx_expr_list *
to rtx_insn_list *, and use its "insn" method rather than
"element" method.
* cfgrtl.c (delete_insn): Use new function
remove_node_from_insn_list rather than
remove_node_from_expr_list.
(cfg_layout_initialize): Convert local "x" from rtx_expr_list *
to rtx_insn_list *, and use its "insn" method rather than
"element" method.
* dwarf2cfi.c (create_trace_edges): Likewise for local "lab".
* reload1.c (set_initial_label_offsets): Likewise for local "x".
* rtlanal.c (remove_node_from_insn_list): New function, adapted
from remove_node_from_expr_list.
* stmt.c (expand_label): When prepending to
nonlocal_goto_handler_labels, use gen_rtx_INSN_LIST rather than
gen_rtx_EXPR_LIST.
From-SVN: r214687
Diffstat (limited to 'gcc/rtlanal.c')
-rw-r--r-- | gcc/rtlanal.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index ceaa7ab..21de0ad 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -2243,6 +2243,35 @@ remove_node_from_expr_list (const_rtx node, rtx_expr_list **listp) temp = temp->next (); } } + +/* Search LISTP (an INSN_LIST) for an entry whose first operand is NODE and + remove that entry from the list if it is found. + + A simple equality test is used to determine if NODE matches. */ + +void +remove_node_from_insn_list (const rtx_insn *node, rtx_insn_list **listp) +{ + rtx_insn_list *temp = *listp; + rtx prev = NULL; + + while (temp) + { + if (node == temp->insn ()) + { + /* Splice the node out of the list. */ + if (prev) + XEXP (prev, 1) = temp->next (); + else + *listp = temp->next (); + + return; + } + + prev = temp; + temp = temp->next (); + } +} /* Nonzero if X contains any volatile instructions. These are instructions which may cause unpredictable machine state instructions, and thus no |