diff options
author | hagog <hagog@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-04-03 08:44:33 +0000 |
---|---|---|
committer | hagog <hagog@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-04-03 08:44:33 +0000 |
commit | c50ae675d1e02325c13da64e4841cb8774b2bb54 (patch) | |
tree | 0b472172f6a31148aad4e01247e8d9a83810ecd0 /gcc/cfghooks.c | |
parent | df855acf8329407f5ff54914616e381f70e6c962 (diff) | |
download | gcc-c50ae675d1e02325c13da64e4841cb8774b2bb54.tar.gz |
2005-03-30 Mostafa Hagog <mustafa@il.ibm.com>
* cfghooks.c (lv_flush_pending_stmts,
cfg_hook_duplicate_loop_to_header_edge, extract_cond_bb_edges,
lv_adjust_loop_header_phi, lv_add_condition_to_bb): New.
* cfghooks.h (cfg_hook_duplicate_loop_to_header_edge,
lv_add_condition_to_bb,
lv_adjust_loop_header_phi, extract_cond_bb_edges,
flush_pending_stmts): New in cfg_hooks structure.
(cfg_hook_duplicate_loop_to_header_edge, lv_flush_pending_stmts,
extract_cond_bb_edges, lv_adjust_loop_header_phi,
lv_add_condition_to_bb): New declarations.
* cfgloop.h (duplicate_loop_to_header_edge): Change return type to
bool.
(loop_version): Declare.
* cfgloopmanip.c (cfghooks.h): Include.
(duplicate_loop_to_header_edge): Change return type to bool.
(loop_version, lv_adjust_loop_entry_edge): Move here.
* cfgrtl.c (cfgloop.h): Include.
(rtl_verify_flow_info_1): Fix.
(rtl_lv_add_condition_to_bb, rtl_extract_cond_bb_edges): New.
(rtl_cfg_hooks, cfg_layout_rtl_cfg_hook): Add hooks to
initialization.
* tree-cfg.c (tree_lv_adjust_loop_header_phi,
tree_lv_add_condition_to_bb): New.
(tree_cfg_hooks): Add new hooks to initialization.
* tree-ssa-loop-manip.c (lv_adjust_loop_header_phi,
lv_adjust_loop_entry_edge, tree_ssa_loop_version): Remove.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@97481 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cfghooks.c')
-rw-r--r-- | gcc/cfghooks.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/gcc/cfghooks.c b/gcc/cfghooks.c index 4f8f18a97c6..eb21afe6fa1 100644 --- a/gcc/cfghooks.c +++ b/gcc/cfghooks.c @@ -823,3 +823,66 @@ execute_on_shrinking_pred (edge e) if (cfg_hooks->execute_on_shrinking_pred) cfg_hooks->execute_on_shrinking_pred (e); } + +/* This is used inside loop versioning when we want to insert + stmts/insns on the edges, which have a different behaviour + in tree's and in RTL, so we made a CFG hook. */ +void +lv_flush_pending_stmts (edge e) +{ + if (cfg_hooks->flush_pending_stmts) + cfg_hooks->flush_pending_stmts (e); +} + +/* Loop versioning uses the duplicate_loop_to_header_edge to create + a new version of the loop basic-blocks, the parameters here are + exactly the same as in duplicate_loop_to_header_edge or + tree_duplicate_loop_to_header_edge; while in tree-ssa there is + additional work to maintain ssa information that's why there is + a need to call the tree_duplicate_loop_to_header_edge rather + than duplicate_loop_to_header_edge when we are in tree mode. */ +bool +cfg_hook_duplicate_loop_to_header_edge (struct loop *loop, edge e, + struct loops *loops, unsigned int ndupl, + sbitmap wont_exit, edge orig, + edge *to_remove, + unsigned int *n_to_remove, int flags) +{ + gcc_assert (cfg_hooks->cfg_hook_duplicate_loop_to_header_edge); + return cfg_hooks->cfg_hook_duplicate_loop_to_header_edge (loop, e, loops, + ndupl, wont_exit, + orig, to_remove, + n_to_remove, flags); +} + +/* Conditional jumps are represented differently in trees and RTL, + this hook takes a basic block that is known to have a cond jump + at its end and extracts the taken and not taken eges out of it + and store it in E1 and E2 respectively. */ +void +extract_cond_bb_edges (basic_block b, edge *e1, edge *e2) +{ + gcc_assert (cfg_hooks->extract_cond_bb_edges); + cfg_hooks->extract_cond_bb_edges (b, e1, e2); +} + +/* Responsible for updating the ssa info (PHI nodes) on the + new conidtion basic block that guargs the versioned loop. */ +void +lv_adjust_loop_header_phi (basic_block first, basic_block second, + basic_block new, edge e) +{ + if (cfg_hooks->lv_adjust_loop_header_phi) + cfg_hooks->lv_adjust_loop_header_phi (first, second, new, e); +} + +/* Conditions in trees and RTL are different so we need + a different handling when we add the condition to the + versioning code. */ +void +lv_add_condition_to_bb (basic_block first, basic_block second, + basic_block new, void *cond) +{ + gcc_assert (cfg_hooks->lv_add_condition_to_bb); + cfg_hooks->lv_add_condition_to_bb (first, second, new, cond); +} |