projects
/
libfirm
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix inconsistency between reg_req and ins of Push: reg_req expected the stack in...
[libfirm]
/
ir
/
ir
/
irgmod.c
diff --git
a/ir/ir/irgmod.c
b/ir/ir/irgmod.c
index
3d83477
..
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 */
/*--------------------------------------------------------------------*/
@@
-220,7
+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));
- set_irn_n(new_block, -1, mbh);
+
+ 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();
@@
-253,12
+261,13
@@
void part_block(ir_node *node) {
assert(is_Block(curr));
next = get_irn_link(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;
set_irn_link(block, get_irn_link(old_block));
set_irn_link(old_block, block);
break;