projects
/
libfirm
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
forbid calls of new_XXX and new_d_XXX when not in phase_building (only new_r_XXX...
[libfirm]
/
ir
/
be
/
beirgmod.c
diff --git
a/ir/be/beirgmod.c
b/ir/be/beirgmod.c
index
5e3dcb0
..
93cc7de
100644
(file)
--- a/
ir/be/beirgmod.c
+++ b/
ir/be/beirgmod.c
@@
-29,9
+29,7
@@
* - empty block elimination
* - a simple dead node elimination (set inputs of unreachable nodes to BAD)
*/
* - empty block elimination
* - a simple dead node elimination (set inputs of unreachable nodes to BAD)
*/
-#ifdef HAVE_CONFIG_H
#include "config.h"
#include "config.h"
-#endif
#include <stdlib.h>
#include <stdlib.h>
@@
-53,19
+51,20
@@
#include "iredges_t.h"
#include "irgraph_t.h"
#include "irgopt.h"
#include "iredges_t.h"
#include "irgraph_t.h"
#include "irgopt.h"
+#include "irgmod.h"
#include "irprintf_t.h"
#include "irgwalk.h"
#include "be_t.h"
#include "bechordal_t.h"
#include "irprintf_t.h"
#include "irgwalk.h"
#include "be_t.h"
#include "bechordal_t.h"
-#include "bearch
_t
.h"
-#include "besched
_t
.h"
+#include "bearch.h"
+#include "besched.h"
#include "belive_t.h"
#include "belive_t.h"
-#include "benode
_t
.h"
+#include "benode.h"
#include "beutil.h"
#include "beinsn_t.h"
#include "bessaconstr.h"
#include "beutil.h"
#include "beinsn_t.h"
#include "bessaconstr.h"
-#include "beirg
_t
.h"
+#include "beirg.h"
#include "beirgmod.h"
#include "bemodule.h"
#include "beirgmod.h"
#include "bemodule.h"
@@
-80,14
+79,11
@@
DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;)
*/
*/
-ir_node *insert_Perm_after(be_irg_t *birg,
- const arch_register_class_t *cls,
+ir_node *insert_Perm_after(ir_graph *irg, const arch_register_class_t *cls,
ir_node *pos)
{
ir_node *pos)
{
- const arch_env_t *arch_env = &birg->main_env->arch_env;
- be_lv_t *lv = birg->lv;
+ be_lv_t *lv = be_get_irg_liveness(irg);
ir_node *bl = is_Block(pos) ? pos : get_nodes_block(pos);
ir_node *bl = is_Block(pos) ? pos : get_nodes_block(pos);
- ir_graph *irg = get_irn_irg(bl);
ir_nodeset_t live;
ir_nodeset_iterator_t iter;
ir_nodeset_t live;
ir_nodeset_iterator_t iter;
@@
-97,15
+93,15
@@
ir_node *insert_Perm_after(be_irg_t *birg,
DBG((dbg, LEVEL_1, "Insert Perm after: %+F\n", pos));
ir_nodeset_init(&live);
DBG((dbg, LEVEL_1, "Insert Perm after: %+F\n", pos));
ir_nodeset_init(&live);
- be_liveness_nodes_live_at(lv,
arch_env,
cls, pos, &live);
+ be_liveness_nodes_live_at(lv, cls, pos, &live);
n = ir_nodeset_size(&live);
n = ir_nodeset_size(&live);
- if(n == 0) {
+ if
(n == 0) {
ir_nodeset_destroy(&live);
return NULL;
}
ir_nodeset_destroy(&live);
return NULL;
}
- nodes =
xmalloc(n * sizeof(nodes[0])
);
+ nodes =
XMALLOCN(ir_node*, n
);
DBG((dbg, LEVEL_1, "live:\n"));
i = 0;
DBG((dbg, LEVEL_1, "live:\n"));
i = 0;
@@
-116,23
+112,23
@@
ir_node *insert_Perm_after(be_irg_t *birg,
}
ir_nodeset_destroy(&live);
}
ir_nodeset_destroy(&live);
- perm = be_new_Perm(cls,
irg,
bl, n, nodes);
+ perm = be_new_Perm(cls, bl, n, nodes);
sched_add_after(pos, perm);
free(nodes);
curr = perm;
for (i = 0; i < n; ++i) {
ir_node *perm_op = get_irn_n(perm, i);
sched_add_after(pos, perm);
free(nodes);
curr = perm;
for (i = 0; i < n; ++i) {
ir_node *perm_op = get_irn_n(perm, i);
- const arch_register_t *reg = arch_get_irn_register(
arch_env,
perm_op);
+ const arch_register_t *reg = arch_get_irn_register(perm_op);
be_ssa_construction_env_t senv;
ir_mode *mode = get_irn_mode(perm_op);
be_ssa_construction_env_t senv;
ir_mode *mode = get_irn_mode(perm_op);
- ir_node *proj = new_r_Proj(
irg, bl,
perm, mode, i);
- arch_set_irn_register(
arch_env,
proj, reg);
+ ir_node *proj = new_r_Proj(perm, mode, i);
+ arch_set_irn_register(proj, reg);
curr = proj;
curr = proj;
- be_ssa_construction_init(&senv,
b
irg);
+ be_ssa_construction_init(&senv, irg);
be_ssa_construction_add_copy(&senv, perm_op);
be_ssa_construction_add_copy(&senv, proj);
be_ssa_construction_fix_users(&senv, perm_op);
be_ssa_construction_add_copy(&senv, perm_op);
be_ssa_construction_add_copy(&senv, proj);
be_ssa_construction_fix_users(&senv, perm_op);
@@
-159,16
+155,17
@@
static void remove_empty_block(ir_node *block)
ir_node *pred;
ir_node *succ_block;
ir_node *jump = NULL;
ir_node *pred;
ir_node *succ_block;
ir_node *jump = NULL;
+ ir_graph *irg = get_irn_irg(block);
- if (irn_visited(block))
+ if (irn_visited
_else_mark
(block))
return;
return;
- mark_irn_visited(block);
if (get_Block_n_cfgpreds(block) != 1)
goto check_preds;
sched_foreach(block, node) {
if (get_Block_n_cfgpreds(block) != 1)
goto check_preds;
sched_foreach(block, node) {
- if (! is_Jmp(node))
+ if (! is_Jmp(node)
+ && !(arch_irn_get_flags(node) & arch_irn_flags_simple_jump))
goto check_preds;
if (jump != NULL) {
/* we should never have 2 jumps in a block */
goto check_preds;
if (jump != NULL) {
/* we should never have 2 jumps in a block */
@@
-187,36
+184,51
@@
static void remove_empty_block(ir_node *block)
assert(succ_block == NULL);
succ_block = get_edge_src_irn(edge);
assert(succ_block == NULL);
succ_block = get_edge_src_irn(edge);
+ if (has_Block_entity(succ_block) && has_Block_entity(block)) {
+ /*
+ * Currently we can add only one label for a block.
+ * Therefore we cannot combine them if both block already have one.
+ */
+ goto check_preds;
+ }
set_irn_n(succ_block, pos, pred);
}
set_irn_n(succ_block, pos, pred);
}
+ if (has_Block_entity(block)) {
+ /* move the label to the successor block */
+ ir_entity *entity = get_Block_entity(block);
+ set_Block_entity(succ_block, entity);
+ }
+
/* there can be some non-scheduled Pin nodes left in the block, move them
/* there can be some non-scheduled Pin nodes left in the block, move them
- * to the succ block */
+ * to the succ block
(Pin) or pred block (Sync)
*/
foreach_out_edge_safe(block, edge, next) {
node = get_edge_src_irn(edge);
foreach_out_edge_safe(block, edge, next) {
node = get_edge_src_irn(edge);
- if(node == jump)
- continue;
- if (is_Block(node)) {
- /* a Block->Block edge: This should be the MacroBlock
- edge, ignore it. */
- assert(get_Block_MacroBlock(node) == block && "Wrong Block->Block edge");
+ if (node == jump)
continue;
continue;
- }
+ /* we simply kill Pins, because there are some strange interactions
+ * between jump threading, which produce PhiMs with Pins, we simply
+ * kill the pins here, everything is scheduled anyway */
if (is_Pin(node)) {
if (is_Pin(node)) {
-
set_nodes_block(node, succ_block
);
+
exchange(node, get_Pin_op(node)
);
continue;
}
if (is_Sync(node)) {
set_nodes_block(node, get_nodes_block(pred));
continue;
}
continue;
}
if (is_Sync(node)) {
set_nodes_block(node, get_nodes_block(pred));
continue;
}
+ if (is_End(node)) { /* End-keep, reroute it to the successor */
+ int pos = get_edge_src_pos(edge);
+ set_irn_n(node, pos, succ_block);
+ continue;
+ }
panic("Unexpected node %+F in block %+F with empty schedule", node, block);
}
panic("Unexpected node %+F in block %+F with empty schedule", node, block);
}
- set_Block_cfgpred(block, 0, new_
Bad(
));
-
be_
kill_node(jump);
+ set_Block_cfgpred(block, 0, new_
r_Bad(irg
));
+ kill_node(jump);
blocks_removed = 1;
/* check predecessor */
blocks_removed = 1;
/* check predecessor */
@@
-225,7
+237,7
@@
static void remove_empty_block(ir_node *block)
check_preds:
arity = get_Block_n_cfgpreds(block);
check_preds:
arity = get_Block_n_cfgpreds(block);
- for(i = 0; i < arity; ++i) {
+ for
(i = 0; i < arity; ++i) {
ir_node *pred = get_Block_cfgpred_block(block, i);
remove_empty_block(pred);
}
ir_node *pred = get_Block_cfgpred_block(block, i);
remove_empty_block(pred);
}
@@
-239,31
+251,31
@@
int be_remove_empty_blocks(ir_graph *irg)
blocks_removed = 0;
blocks_removed = 0;
-
set_using_irn_visited(irg
);
+
ir_reserve_resources(irg, IR_RESOURCE_IRN_VISITED
);
inc_irg_visited(irg);
remove_empty_block(get_irg_end_block(irg));
end = get_irg_end(irg);
arity = get_irn_arity(end);
inc_irg_visited(irg);
remove_empty_block(get_irg_end_block(irg));
end = get_irg_end(irg);
arity = get_irn_arity(end);
- for(i = 0; i < arity; ++i) {
+ for
(i = 0; i < arity; ++i) {
ir_node *pred = get_irn_n(end, i);
ir_node *pred = get_irn_n(end, i);
- if(!is_Block(pred))
+ if
(!is_Block(pred))
continue;
remove_empty_block(pred);
}
continue;
remove_empty_block(pred);
}
-
clear_using_irn_visited(irg
);
+
ir_free_resources(irg, IR_RESOURCE_IRN_VISITED
);
if (blocks_removed) {
/* invalidate analysis info */
set_irg_doms_inconsistent(irg);
set_irg_extblk_inconsistent(irg);
set_irg_outs_inconsistent(irg);
if (blocks_removed) {
/* invalidate analysis info */
set_irg_doms_inconsistent(irg);
set_irg_extblk_inconsistent(irg);
set_irg_outs_inconsistent(irg);
+ set_irg_loopinfo_inconsistent(irg);
}
return blocks_removed;
}
}
return blocks_removed;
}
+BE_REGISTER_MODULE_CONSTRUCTOR(be_init_irgmod);
void be_init_irgmod(void)
{
FIRM_DBG_REGISTER(dbg, "firm.be.irgmod");
}
void be_init_irgmod(void)
{
FIRM_DBG_REGISTER(dbg, "firm.be.irgmod");
}
-
-BE_REGISTER_MODULE_CONSTRUCTOR(be_init_irgmod);