diff options
author | Christian Bruel <christian.bruel@st.com> | 2014-07-02 15:03:14 +0200 |
---|---|---|
committer | Christian Bruel <chrbr@gcc.gnu.org> | 2014-07-02 15:03:14 +0200 |
commit | cbb1e3d98c5f18f82c1b733aa6338fab78fb891b (patch) | |
tree | d5f4efb38c4b5345b26af85c0f13b1a9412dd461 /gcc/lcm.c | |
parent | b18f1efce09e8cab57d6141754db3456fab938f7 (diff) | |
download | gcc-cbb1e3d98c5f18f82c1b733aa6338fab78fb891b.zip gcc-cbb1e3d98c5f18f82c1b733aa6338fab78fb891b.tar.gz gcc-cbb1e3d98c5f18f82c1b733aa6338fab78fb891b.tar.bz2 |
Support mode toggle.
* mode-switching.c (struct bb_info): Add mode_out, mode_in caches.
(make_preds_opaque): Delete.
(clear_mode_bit, mode_bit_p, set_mode_bit): New macros.
(commit_mode_sets): New function.
(optimize_mode_switching): Handle current_mode to mode_switching_emit.
Process all modes at once.
* basic-block.h (pre_edge_lcm_avs): Declare.
* lcm.c (pre_edge_lcm_avs): Renamed from pre_edge_lcm.
Call clear_aux_for_edges. Fix comments.
(pre_edge_lcm): New wrapper function to call pre_edge_lcm_avs.
(pre_edge_rev_lcm): Idem.
* config/epiphany/epiphany.c (emit_set_fp_mode): Add prev_mode parameter.
* config/epiphany/epiphany-protos.h (emit_set_fp_mode): Idem.
* config/epiphany/resolve-sw-modes.c (pass_resolve_sw_modes::execute): Idem.
* config/i386/i386.c (x96_emit_mode_set): Idem.
* config/sh/sh.c (sh_emit_mode_set): Likewise. Handle PR toggle.
* config/sh/sh.md (toggle_pr): Defined if TARGET_FPU_SINGLE.
(fpscr_toggle) Disallow from delay slot.
* target.def (emit_mode_set): Add prev_mode parameter.
* doc/tm.texi: Regenerate.
From-SVN: r212230
Diffstat (limited to 'gcc/lcm.c')
-rw-r--r-- | gcc/lcm.c | 34 |
1 files changed, 26 insertions, 8 deletions
@@ -377,17 +377,17 @@ compute_insert_delete (struct edge_list *edge_list, sbitmap *antloc, } } -/* Given local properties TRANSP, ANTLOC, AVOUT, KILL return the insert and - delete vectors for edge based LCM. Returns an edgelist which is used to +/* Given local properties TRANSP, ANTLOC, AVLOC, KILL return the insert and + delete vectors for edge based LCM and return the AVIN, AVOUT bitmap. map the insert vector to what edge an expression should be inserted on. */ struct edge_list * -pre_edge_lcm (int n_exprs, sbitmap *transp, +pre_edge_lcm_avs (int n_exprs, sbitmap *transp, sbitmap *avloc, sbitmap *antloc, sbitmap *kill, + sbitmap *avin, sbitmap *avout, sbitmap **insert, sbitmap **del) { sbitmap *antin, *antout, *earliest; - sbitmap *avin, *avout; sbitmap *later, *laterin; struct edge_list *edge_list; int num_edges; @@ -413,10 +413,7 @@ pre_edge_lcm (int n_exprs, sbitmap *transp, #endif /* Compute global availability. */ - avin = sbitmap_vector_alloc (last_basic_block_for_fn (cfun), n_exprs); - avout = sbitmap_vector_alloc (last_basic_block_for_fn (cfun), n_exprs); compute_available (avloc, kill, avout, avin); - sbitmap_vector_free (avin); /* Compute global anticipatability. */ antin = sbitmap_vector_alloc (last_basic_block_for_fn (cfun), n_exprs); @@ -444,7 +441,6 @@ pre_edge_lcm (int n_exprs, sbitmap *transp, sbitmap_vector_free (antout); sbitmap_vector_free (antin); - sbitmap_vector_free (avout); later = sbitmap_vector_alloc (num_edges, n_exprs); @@ -485,6 +481,28 @@ pre_edge_lcm (int n_exprs, sbitmap *transp, return edge_list; } +/* Wrapper to allocate avin/avout and call pre_edge_lcm_avs. */ + +struct edge_list * +pre_edge_lcm (int n_exprs, sbitmap *transp, + sbitmap *avloc, sbitmap *antloc, sbitmap *kill, + sbitmap **insert, sbitmap **del) +{ + struct edge_list *edge_list; + sbitmap *avin, *avout; + + avin = sbitmap_vector_alloc (last_basic_block_for_fn (cfun), n_exprs); + avout = sbitmap_vector_alloc (last_basic_block_for_fn (cfun), n_exprs); + + edge_list = pre_edge_lcm_avs (n_exprs, transp, avloc, antloc, kill, + avin, avout, insert, del); + + sbitmap_vector_free (avout); + sbitmap_vector_free (avin); + + return edge_list; +} + /* Compute the AVIN and AVOUT vectors from the AVLOC and KILL vectors. Return the number of passes we performed to iterate to a solution. */ |