*/
#ifdef HAVE_CONFIG_H
-# include <config.h>
+# include "config.h"
#endif
#include <assert.h>
+#include "xmalloc.h"
#include "irnode_t.h"
#include "irgraph_t.h"
#include "irprog_t.h"
/* semantics of Phi nodes. */
/*------------------------------------------------------------------*/
+
+static void remove_senseless_conds(ir_node *bl, void *data)
+{
+ int i, j;
+ int n = get_irn_arity(bl);
+
+ assert(is_Block(bl));
+
+ for(i = 0; i < n; ++i) {
+ ir_node *pred_i = get_irn_n(bl, i);
+ ir_node *cond_i = skip_Proj(pred_i);
+
+ for(j = i + 1; j < n; ++j) {
+ ir_node *pred_j = get_irn_n(bl, j);
+ ir_node *cond_j = skip_Proj(pred_j);
+
+ if(cond_j == cond_i
+ && get_irn_opcode(cond_i) == iro_Cond
+ && get_irn_mode(get_Cond_selector(cond_i)) == mode_b) {
+
+ ir_node *jmp = new_r_Jmp(current_ir_graph, get_nodes_block(cond_i));
+ set_irn_n(bl, i, jmp);
+ set_irn_n(bl, j, new_Bad());
+
+ break;
+ }
+ }
+ }
+}
+
+
/**
* Removes Tuples from Block control flow predecessors.
* Optimizes blocks with equivalent_node(). This is tricky,
for (i = 0, k = get_Block_n_cfgpreds(b); i < k; ++i) {
max_preds += test_whether_dispensable(b, i);
}
- in = (ir_node **) malloc(max_preds * sizeof(ir_node *));
+ in = xmalloc(max_preds * sizeof(*in));
/*-
printf(" working on "); DDMN(b);
assert(get_irn_link(b) == NULL || (n_preds == p_preds && "Wrong Phi Fix"));
- free(in);
+ xfree(in);
}
}
}
+ irg_block_walk_graph(current_ir_graph, NULL, remove_senseless_conds, NULL);
/* Use block visited flag to mark non-empty blocks. */
inc_irg_block_visited(irg);
irg_walk(end, merge_blocks, collect_nodes, NULL);
/* DEL_ARR_F(end->in); GL @@@ tut nicht ! */
end->in = in;
+
/* the verifyer doesn't work yet with floating nodes */
if (get_irg_pinned(irg) == op_pin_state_pinned) {
/* after optimize_cf(), only Bad data flow may remain. */