projects
/
libfirm
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Removed unused variables.
[libfirm]
/
ir
/
be
/
bessaconstr.c
diff --git
a/ir/be/bessaconstr.c
b/ir/be/bessaconstr.c
index
bf5ae96
..
031493b
100644
(file)
--- a/
ir/be/bessaconstr.c
+++ b/
ir/be/bessaconstr.c
@@
-29,7
+29,7
@@
* to their closest copy while introducing phis as necessary.
*
* Algorithm: Mark all blocks in the iterated dominance frontiers of the value
* to their closest copy while introducing phis as necessary.
*
* Algorithm: Mark all blocks in the iterated dominance frontiers of the value
- * and it
'
s copies. Link the copies ordered by dominance to the blocks. Then
+ * and its copies. Link the copies ordered by dominance to the blocks. Then
* we search for each use all definitions in the current block, if none is
* found, then we search one in the immediate dominator. If we are in a block
* of the dominance frontier, create a phi and do the same search for all
* we search for each use all definitions in the current block, if none is
* found, then we search one in the immediate dominator. If we are in a block
* of the dominance frontier, create a phi and do the same search for all
@@
-53,10
+53,11
@@
#include "bessaconstr.h"
#include "bemodule.h"
#include "bessaconstr.h"
#include "bemodule.h"
-#include "besched
_t
.h"
+#include "besched.h"
#include "beintlive_t.h"
#include "beintlive_t.h"
-#include "beirg
_t
.h"
+#include "beirg.h"
#include "be_t.h"
#include "be_t.h"
+#include "benode.h"
#include "debug.h"
#include "error.h"
#include "debug.h"
#include "error.h"
@@
-74,15
+75,15
@@
DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;)
* blocks as visited. Sets the link fields of the blocks in the dominance
* frontier to the block itself.
*/
* blocks as visited. Sets the link fields of the blocks in the dominance
* frontier to the block itself.
*/
-static
-
void mark_iterated_dominance_frontiers(
const be_ssa_construction_env_t *env)
+static
void mark_iterated_dominance_frontiers(
+
const be_ssa_construction_env_t *env)
{
stat_ev_cnt_decl(blocks);
DBG((dbg, LEVEL_3, "Dominance Frontier:"));
stat_ev_tim_push();
while (!waitq_empty(env->worklist)) {
int i;
{
stat_ev_cnt_decl(blocks);
DBG((dbg, LEVEL_3, "Dominance Frontier:"));
stat_ev_tim_push();
while (!waitq_empty(env->worklist)) {
int i;
- ir_node
*block =
waitq_get(env->worklist);
+ ir_node
*block = (ir_node*)
waitq_get(env->worklist);
ir_node **domfront = be_get_dominance_frontier(env->domfronts, block);
int domfront_len = ARR_LEN(domfront);
ir_node **domfront = be_get_dominance_frontier(env->domfronts, block);
int domfront_len = ARR_LEN(domfront);
@@
-106,38
+107,35
@@
void mark_iterated_dominance_frontiers(const be_ssa_construction_env_t *env)
DBG((dbg, LEVEL_3, "\n"));
}
DBG((dbg, LEVEL_3, "\n"));
}
-static
-ir_node *search_def_end_of_block(be_ssa_construction_env_t *env,
- ir_node *block);
+static ir_node *search_def_end_of_block(be_ssa_construction_env_t *env,
+ ir_node *block);
-static
-ir_node *create_phi(be_ssa_construction_env_t *env, ir_node *block,
- ir_node *link_with)
+static ir_node *create_phi(be_ssa_construction_env_t *env, ir_node *block,
+ ir_node *link_with)
{
int i, n_preds = get_Block_n_cfgpreds(block);
{
int i, n_preds = get_Block_n_cfgpreds(block);
- ir_graph *irg = get_
irn
_irg(block);
+ ir_graph *irg = get_
Block
_irg(block);
ir_node **ins = ALLOCAN(ir_node*, n_preds);
ir_node **ins = ALLOCAN(ir_node*, n_preds);
+ ir_node *dummy;
ir_node *phi;
assert(n_preds > 1);
ir_node *phi;
assert(n_preds > 1);
- for(i = 0; i < n_preds; ++i) {
- ins[i] = new_r_Unknown(irg, env->mode);
+ dummy = new_r_Dummy(irg, env->mode);
+ for (i = 0; i < n_preds; ++i) {
+ ins[i] = dummy;
}
}
- phi = new_r_Phi(irg, block, n_preds, ins, env->mode);
- if(env->new_phis != NULL) {
+ phi = be_new_Phi(block, n_preds, ins, env->mode, env->phi_cls);
+ sched_add_after(block, phi);
+ if (env->new_phis != NULL) {
ARR_APP1(ir_node*, env->new_phis, phi);
}
ARR_APP1(ir_node*, env->new_phis, phi);
}
- if(env->mode != mode_M) {
- sched_add_after(block, phi);
- }
-
DBG((dbg, LEVEL_2, "\tcreating phi %+F in %+F\n", phi, block));
set_irn_link(link_with, phi);
mark_irn_visited(block);
DBG((dbg, LEVEL_2, "\tcreating phi %+F in %+F\n", phi, block));
set_irn_link(link_with, phi);
mark_irn_visited(block);
- for(i = 0; i < n_preds; ++i) {
+ for
(i = 0; i < n_preds; ++i) {
ir_node *pred_block = get_Block_cfgpred_block(block, i);
ir_node *pred_def = search_def_end_of_block(env, pred_block);
ir_node *pred_block = get_Block_cfgpred_block(block, i);
ir_node *pred_def = search_def_end_of_block(env, pred_block);
@@
-147,21
+145,20
@@
ir_node *create_phi(be_ssa_construction_env_t *env, ir_node *block,
return phi;
}
return phi;
}
-static
-ir_node *get_def_at_idom(be_ssa_construction_env_t *env, ir_node *block)
+static ir_node *get_def_at_idom(be_ssa_construction_env_t *env, ir_node *block)
{
ir_node *dom = get_Block_idom(block);
assert(dom != NULL);
return search_def_end_of_block(env, dom);
}
{
ir_node *dom = get_Block_idom(block);
assert(dom != NULL);
return search_def_end_of_block(env, dom);
}
-static
-
ir_node *search_def_end_of_block(be_ssa_construction_env_t *env,
ir_node *block)
+static
ir_node *search_def_end_of_block(be_ssa_construction_env_t *env,
+
ir_node *block)
{
{
- if(irn_visited(block)) {
+ if
(irn_visited(block)) {
assert(get_irn_link(block) != NULL);
assert(get_irn_link(block) != NULL);
- return get_irn_link(block);
- } else if(Block_block_visited(block)) {
+ return
(ir_node*)
get_irn_link(block);
+ } else if
(Block_block_visited(block)) {
return create_phi(env, block, block);
} else {
ir_node *def = get_def_at_idom(env, block);
return create_phi(env, block, block);
} else {
ir_node *def = get_def_at_idom(env, block);
@@
-171,8
+168,7
@@
ir_node *search_def_end_of_block(be_ssa_construction_env_t *env, ir_node *block)
}
}
}
}
-static
-ir_node *search_def(be_ssa_construction_env_t *env, ir_node *at)
+static ir_node *search_def(be_ssa_construction_env_t *env, ir_node *at)
{
ir_node *block = get_nodes_block(at);
ir_node *node;
{
ir_node *block = get_nodes_block(at);
ir_node *node;
@@
-181,7
+177,7
@@
ir_node *search_def(be_ssa_construction_env_t *env, ir_node *at)
DBG((dbg, LEVEL_3, "\t...searching def at %+F\n", at));
/* no defs in the current block we can do the normal searching */
DBG((dbg, LEVEL_3, "\t...searching def at %+F\n", at));
/* no defs in the current block we can do the normal searching */
- if(!irn_visited(block) && !Block_block_visited(block)) {
+ if
(!irn_visited(block) && !Block_block_visited(block)) {
DBG((dbg, LEVEL_3, "\t...continue at idom\n"));
return get_def_at_idom(env, block);
}
DBG((dbg, LEVEL_3, "\t...continue at idom\n"));
return get_def_at_idom(env, block);
}
@@
-190,19
+186,19
@@
ir_node *search_def(be_ssa_construction_env_t *env, ir_node *at)
the one immediately dominating us
*/
node = block;
the one immediately dominating us
*/
node = block;
- def = get_irn_link(node);
- while(def != NULL) {
- if(!value_dominates(at, def)) {
+ def =
(ir_node*)
get_irn_link(node);
+ while
(def != NULL) {
+ if
(!value_dominates(at, def)) {
DBG((dbg, LEVEL_3, "\t...found dominating def %+F\n", def));
return def;
}
node = def;
DBG((dbg, LEVEL_3, "\t...found dominating def %+F\n", def));
return def;
}
node = def;
- def = get_irn_link(node);
+ def =
(ir_node*)
get_irn_link(node);
}
/* block in dominance frontier? create a phi then */
}
/* block in dominance frontier? create a phi then */
- if(Block_block_visited(block)) {
+ if
(Block_block_visited(block)) {
DBG((dbg, LEVEL_3, "\t...create phi at block %+F\n", block));
assert(!is_Phi(node));
return create_phi(env, block, node);
DBG((dbg, LEVEL_3, "\t...create phi at block %+F\n", block));
assert(!is_Phi(node));
return create_phi(env, block, node);
@@
-217,22
+213,21
@@
ir_node *search_def(be_ssa_construction_env_t *env, ir_node *at)
* sorted by dominance. A non-visited block means no definition has been
* inserted yet.
*/
* sorted by dominance. A non-visited block means no definition has been
* inserted yet.
*/
-static
-void introduce_def_at_block(ir_node *block, ir_node *def)
+static void introduce_def_at_block(ir_node *block, ir_node *def)
{
if (irn_visited_else_mark(block)) {
ir_node *node = block;
ir_node *current_def;
{
if (irn_visited_else_mark(block)) {
ir_node *node = block;
ir_node *current_def;
-
while(1
) {
- current_def = get_irn_link(node);
- if(current_def == def) {
+
for (;;
) {
+ current_def =
(ir_node*)
get_irn_link(node);
+ if
(current_def == def) {
/* already in block */
return;
}
/* already in block */
return;
}
- if(current_def == NULL)
+ if
(current_def == NULL)
break;
break;
- if(value_dominates(current_def, def))
+ if
(value_dominates(current_def, def))
break;
node = current_def;
}
break;
node = current_def;
}
@@
-245,9
+240,8
@@
void introduce_def_at_block(ir_node *block, ir_node *def)
}
}
}
}
-void be_ssa_construction_init(be_ssa_construction_env_t *env,
be_irg_t *b
irg)
+void be_ssa_construction_init(be_ssa_construction_env_t *env,
ir_graph *
irg)
{
{
- ir_graph *irg = be_get_birg_irg(birg);
ir_node *sb = get_irg_start_block(irg);
int n_blocks = get_Block_dom_max_subtree_pre_num(sb);
ir_node *sb = get_irg_start_block(irg);
int n_blocks = get_Block_dom_max_subtree_pre_num(sb);
@@
-258,10
+252,10
@@
void be_ssa_construction_init(be_ssa_construction_env_t *env, be_irg_t *birg)
stat_ev_dbl("bessaconstr_n_blocks", n_blocks);
memset(env, 0, sizeof(env[0]));
stat_ev_dbl("bessaconstr_n_blocks", n_blocks);
memset(env, 0, sizeof(env[0]));
- be_assure_dom_front(
b
irg);
+ be_assure_dom_front(irg);
env->irg = irg;
env->irg = irg;
- env->domfronts = be_get_
birg_dom_front(b
irg);
+ env->domfronts = be_get_
irg_dom_front(
irg);
env->new_phis = NEW_ARR_F(ir_node*, 0);
env->worklist = new_waitq();
env->new_phis = NEW_ARR_F(ir_node*, 0);
env->worklist = new_waitq();
@@
-296,15
+290,16
@@
void be_ssa_construction_add_copy(be_ssa_construction_env_t *env,
assert(env->iterated_domfront_calculated == 0);
assert(env->iterated_domfront_calculated == 0);
- if(env->mode == NULL) {
- env->mode = get_irn_mode(copy);
+ if (env->mode == NULL) {
+ env->mode = get_irn_mode(copy);
+ env->phi_cls = arch_get_irn_reg_class_out(copy);
} else {
assert(env->mode == get_irn_mode(copy));
}
block = get_nodes_block(copy);
} else {
assert(env->mode == get_irn_mode(copy));
}
block = get_nodes_block(copy);
- if(!irn_visited(block)) {
+ if
(!irn_visited(block)) {
waitq_put(env->worklist, block);
}
introduce_def_at_block(block, copy);
waitq_put(env->worklist, block);
}
introduce_def_at_block(block, copy);
@@
-317,16
+312,17
@@
void be_ssa_construction_add_copies(be_ssa_construction_env_t *env,
assert(env->iterated_domfront_calculated == 0);
assert(env->iterated_domfront_calculated == 0);
- if(env->mode == NULL) {
- env->mode = get_irn_mode(copies[0]);
+ if (env->mode == NULL) {
+ env->mode = get_irn_mode(copies[0]);
+ env->phi_cls = arch_get_irn_reg_class_out(copies[0]);
}
}
- for(i = 0; i < copies_len; ++i) {
- ir_node *copy = copies[i];
+ for
(i = 0; i < copies_len; ++i) {
+ ir_node *copy
= copies[i];
ir_node *block = get_nodes_block(copy);
assert(env->mode == get_irn_mode(copy));
ir_node *block = get_nodes_block(copy);
assert(env->mode == get_irn_mode(copy));
- if(!irn_visited(block)) {
+ if
(!irn_visited(block)) {
waitq_put(env->worklist, block);
}
introduce_def_at_block(block, copy);
waitq_put(env->worklist, block);
}
introduce_def_at_block(block, copy);
@@
-351,15
+347,15
@@
void be_ssa_construction_fix_users_array(be_ssa_construction_env_t *env,
size_t i;
stat_ev_cnt_decl(uses);
size_t i;
stat_ev_cnt_decl(uses);
-
BE_TIMER_PUSH(t_ssa_constr
);
+
be_timer_push(T_SSA_CONSTR
);
- if(!env->iterated_domfront_calculated) {
+ if
(!env->iterated_domfront_calculated) {
mark_iterated_dominance_frontiers(env);
env->iterated_domfront_calculated = 1;
}
stat_ev_tim_push();
mark_iterated_dominance_frontiers(env);
env->iterated_domfront_calculated = 1;
}
stat_ev_tim_push();
- for(i = 0; i < nodes_len; ++i) {
+ for
(i = 0; i < nodes_len; ++i) {
ir_node *value = nodes[i];
/*
ir_node *value = nodes[i];
/*
@@
-371,21
+367,21
@@
void be_ssa_construction_fix_users_array(be_ssa_construction_env_t *env,
int pos = get_edge_src_pos(edge);
ir_node *def;
int pos = get_edge_src_pos(edge);
ir_node *def;
- if
(env->ignore_uses != NULL
&&
+ if
(env->ignore_uses != NULL
&&
ir_nodeset_contains(env->ignore_uses, use))
continue;
ir_nodeset_contains(env->ignore_uses, use))
continue;
- if
(is_Anchor
(use))
+ if
(is_Anchor(use) || is_End
(use))
continue;
continue;
- if(is_Phi(use)) {
- ir_node *block = get_nodes_block(use);
+ if
(is_Phi(use)) {
+ ir_node *block
= get_nodes_block(use);
ir_node *predblock = get_Block_cfgpred_block(block, pos);
at = sched_last(predblock);
}
def = search_def(env, at);
ir_node *predblock = get_Block_cfgpred_block(block, pos);
at = sched_last(predblock);
}
def = search_def(env, at);
- if(def == NULL) {
+ if
(def == NULL) {
panic("no definition found for %+F at position %d", use, pos);
}
panic("no definition found for %+F at position %d", use, pos);
}
@@
-394,7
+390,7
@@
void be_ssa_construction_fix_users_array(be_ssa_construction_env_t *env,
stat_ev_cnt_inc(uses);
}
}
stat_ev_cnt_inc(uses);
}
}
-
BE_TIMER_POP(t_ssa_constr
);
+
be_timer_pop(T_SSA_CONSTR
);
stat_ev_tim_pop("bessaconstr_fix_time");
stat_ev_cnt_done(uses, "bessaconstr_uses");
stat_ev_tim_pop("bessaconstr_fix_time");
stat_ev_cnt_done(uses, "bessaconstr_uses");
@@
-411,20
+407,19
@@
void be_ssa_construction_update_liveness_phis(be_ssa_construction_env_t *env,
{
int i, n;
{
int i, n;
-
BE_TIMER_PUSH(t_ssa_constr
);
+
be_timer_push(T_SSA_CONSTR
);
n = ARR_LEN(env->new_phis);
n = ARR_LEN(env->new_phis);
- for(i = 0; i < n; ++i) {
+ for
(i = 0; i < n; ++i) {
ir_node *phi = env->new_phis[i];
be_liveness_introduce(lv, phi);
}
ir_node *phi = env->new_phis[i];
be_liveness_introduce(lv, phi);
}
-
BE_TIMER_POP(t_ssa_constr
);
+
be_timer_pop(T_SSA_CONSTR
);
}
}
+BE_REGISTER_MODULE_CONSTRUCTOR(be_init_ssaconstr);
void be_init_ssaconstr(void)
{
FIRM_DBG_REGISTER(dbg, "firm.be.ssaconstr");
}
void be_init_ssaconstr(void)
{
FIRM_DBG_REGISTER(dbg, "firm.be.ssaconstr");
}
-
-BE_REGISTER_MODULE_CONSTRUCTOR(be_init_ssaconstr);