projects
/
libfirm
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
- BugFix of the last fix ...
[libfirm]
/
ir
/
ir
/
irgmod.c
diff --git
a/ir/ir/irgmod.c
b/ir/ir/irgmod.c
index
cb03b6c
..
f9a4f48
100644
(file)
--- a/
ir/ir/irgmod.c
+++ b/
ir/ir/irgmod.c
@@
-96,8
+96,6
@@
void exchange(ir_node *old, ir_node *nw) {
/* Else, do it the old-fashioned way. */
ir_node *block;
/* Else, do it the old-fashioned way. */
ir_node *block;
- assert(get_irn_op(old)->opar != oparity_dynamic);
-
hook_turn_into_id(old);
block = old->in[0];
hook_turn_into_id(old);
block = old->in[0];
@@
-109,6
+107,10
@@
void exchange(ir_node *old, ir_node *nw) {
}
}
}
}
+ if (get_irn_op(old)->opar == oparity_dynamic) {
+ DEL_ARR_F(get_irn_in(old));
+ }
+
old->op = op_Id;
old->in = NEW_ARR_D (ir_node *, irg->obst, 2);
old->in[0] = block;
old->op = op_Id;
old->in = NEW_ARR_D (ir_node *, irg->obst, 2);
old->in[0] = block;
@@
-125,7
+127,7
@@
void exchange(ir_node *old, ir_node *nw) {
* all Proj nodes to there predecessors and all
* partBlocks to there MacroBlock header.
*/
* all Proj nodes to there predecessors and all
* partBlocks to there MacroBlock header.
*/
-static void collect(ir_node *n, void *env) {
+static void collect
_phiprojs_walker
(ir_node *n, void *env) {
ir_node *pred;
(void) env;
ir_node *pred;
(void) env;
@@
-154,7
+156,7
@@
static void collect(ir_node *n, void *env) {
/**
* clear all links, including the Phi list of blocks and Phi nodes.
*/
/**
* clear all links, including the Phi list of blocks and Phi nodes.
*/
-static void clear_links(ir_node *n, void *env) {
+static void clear_
node_and_phis_
links(ir_node *n, void *env) {
(void) env;
set_irn_link(n, NULL);
(void) env;
set_irn_link(n, NULL);
@@
-165,10
+167,9
@@
static void clear_links(ir_node *n, void *env) {
}
void collect_phiprojs(ir_graph *irg) {
}
void collect_phiprojs(ir_graph *irg) {
- irg_walk_graph(irg, clear_
links, collect
, NULL);
+ irg_walk_graph(irg, clear_
node_and_phis_links, collect_phiprojs_walker
, NULL);
}
}
-
/*--------------------------------------------------------------------*/
/* Functionality for part_block */
/*--------------------------------------------------------------------*/
/*--------------------------------------------------------------------*/
/* Functionality for part_block */
/*--------------------------------------------------------------------*/
@@
-179,14
+180,13
@@
void collect_phiprojs(ir_graph *irg) {
*/
static void move(ir_node *node, ir_node *from_bl, ir_node *to_bl) {
int i, arity;
*/
static void move(ir_node *node, ir_node *from_bl, ir_node *to_bl) {
int i, arity;
- ir_node *proj, *pred;
/* move this node */
set_nodes_block(node, to_bl);
/* move this node */
set_nodes_block(node, to_bl);
- /* move its
p
rojs */
+ /* move its
P
rojs */
if (get_irn_mode(node) == mode_T) {
if (get_irn_mode(node) == mode_T) {
- proj = get_irn_link(node);
+
ir_node *
proj = get_irn_link(node);
while (proj) {
if (get_nodes_block(proj) == from_bl)
set_nodes_block(proj, to_bl);
while (proj) {
if (get_nodes_block(proj) == from_bl)
set_nodes_block(proj, to_bl);
@@
-195,11
+195,12
@@
static void move(ir_node *node, ir_node *from_bl, ir_node *to_bl) {
}
/* recursion ... */
}
/* recursion ... */
- if (get_irn_op(node) == op_Phi) return;
+ if (is_Phi(node))
+ return;
arity = get_irn_arity(node);
for (i = 0; i < arity; i++) {
arity = get_irn_arity(node);
for (i = 0; i < arity; i++) {
- pred = get_irn_n(node, i);
+
ir_node *
pred = get_irn_n(node, i);
if (get_nodes_block(pred) == from_bl)
move(pred, from_bl, to_bl);
}
if (get_nodes_block(pred) == from_bl)
move(pred, from_bl, to_bl);
}
@@
-220,6
+221,14
@@
void part_block(ir_node *node) {
mbh = get_Block_MacroBlock(old_block);
new_block = new_Block(get_Block_n_cfgpreds(old_block),
get_Block_cfgpred_arr(old_block));
mbh = get_Block_MacroBlock(old_block);
new_block = new_Block(get_Block_n_cfgpreds(old_block),
get_Block_cfgpred_arr(old_block));
+
+ if (mbh != old_block) {
+ /* we splitting a partBlock */
+ set_Block_MacroBlock(new_block, mbh);
+ } else {
+ /* we are splitting a header: this creates a new header */
+ set_Block_MacroBlock(new_block, new_block);
+ }
set_irg_current_block(current_ir_graph, new_block);
{
ir_node *jmp = new_Jmp();
set_irg_current_block(current_ir_graph, new_block);
{
ir_node *jmp = new_Jmp();
@@
-231,29
+240,44
@@
void part_block(ir_node *node) {
move(node, old_block, new_block);
/* move Phi nodes to new_block */
move(node, old_block, new_block);
/* move Phi nodes to new_block */
- phi = get_
irn_link
(old_block);
- set_
irn_link
(new_block, phi);
- set_
irn_link
(old_block, NULL);
+ phi = get_
Block_phis
(old_block);
+ set_
Block_phis
(new_block, phi);
+ set_
Block_phis
(old_block, NULL);
while (phi) {
set_nodes_block(phi, new_block);
while (phi) {
set_nodes_block(phi, new_block);
- phi = get_
irn_link
(phi);
+ phi = get_
Phi_next
(phi);
}
/* rewire partBlocks */
if (mbh != old_block) {
}
/* rewire partBlocks */
if (mbh != old_block) {
- ir_node *block;
+ ir_node *next, *block = get_irn_link(mbh);
+
+ set_irn_link(mbh, NULL);
+ set_irn_link(old_block, NULL);
- for (block = get_irn_link(mbh); block != NULL; block = get_irn_link(block)) {
+ /* note that we must splice the list of partBlock here */
+ for (; block != NULL; block = next) {
ir_node *curr = block;
ir_node *curr = block;
+ assert(is_Block(curr));
+
+ next = get_irn_link(block);
+ assert(get_Block_MacroBlock(curr) == mbh);
+
for (;;) {
if (curr == old_block) {
/* old_block dominates the block, so old_block will be
the new macro block header */
for (;;) {
if (curr == old_block) {
/* old_block dominates the block, so old_block will be
the new macro block header */
- set_irn_n(block, -1, old_block);
+ set_Block_MacroBlock(block, old_block);
+ set_irn_link(block, get_irn_link(old_block));
+ set_irn_link(old_block, block);
break;
}
break;
}
- if (curr == mbh)
+ if (curr == mbh) {
+ /* leave it in the mbh */
+ set_irn_link(block, get_irn_link(mbh));
+ set_irn_link(mbh, block);
break;
break;
+ }
assert(get_Block_n_cfgpreds(curr) == 1);
curr = get_Block_cfgpred_block(curr, 0);
assert(get_Block_n_cfgpreds(curr) == 1);
curr = get_Block_cfgpred_block(curr, 0);