#include "iredges_t.h"
#include "irgwalk.h"
#include "irprintf.h"
+#include "irgopt.h"
#include "irtools.h"
/**
* Walker environment.
*/
typedef struct _env_t {
- unsigned num_confirms; /**< number of inserted Confirm nodes */
- unsigned num_consts; /**< number of constants placed */
- unsigned num_eq; /**< number of equalities placed */
+ unsigned num_confirms; /**< number of inserted Confirm nodes */
+ unsigned num_consts; /**< number of constants placed */
+ unsigned num_eq; /**< number of equalities placed */
} env_t;
/**
*/
static ir_node *get_effective_use_block(ir_node *node, int pos) {
if (is_Phi(node)) {
- /* the effective use of a Phi is in its predecessor block */
- node = get_irn_n(node, pos);
+ /* the effective use of a Phi argument is in its predecessor block */
+ node = get_nodes_block(node);
+ return get_Block_cfgpred_block(node, pos);
}
return get_nodes_block(node);
}
cond_block = get_nodes_block(cond);
foreach_out_edge(cond, edge) {
ir_node *proj = get_edge_src_irn(edge);
- if (get_Proj_proj(proj) == pnc)
+ if (get_Proj_proj(proj) == (long)pnc)
continue;
edge = get_irn_out_edge_first(proj);
other_blk = get_edge_src_irn(edge);
break;
}
assert(other_blk);
+
+ /*
+ * Note the special case here: if block is a then, there might be no else
+ * block. In that case the other_block is the user_blk itself and pred_block
+ * is the cond_block ...
+ *
+ * Best would be to introduce a block here, removing this critical edge.
+ * For some reasons I cannot repair dominance here, so I have to remove
+ * ALL critical edges...
+ * FIXME: This should not be needed if we could repair dominance ...
+ */
}
n = get_Block_n_cfgpreds(user_blk);
* We have found a user in a non-dominated block:
* check, if all its block predecessors are dominated.
* If yes, place a Phi.
- *
- * Note the special case here: if block is a then, there might be no else
- * block. In that case the other_block is the user_blk itself and pred_block
- * is the cond_block ...
*/
for (i = n - 1; i >= 0; --i) {
ir_node *pred_blk = get_Block_cfgpred_block(user_blk, i);
- if (cond_block != pred_blk &&
- !block_dominates(block, pred_blk) &&
- !block_dominates(other_blk, pred_blk)) {
+ if (!block_dominates(block, pred_blk) &&
+ !block_dominates(other_blk, pred_blk)) {
/* can't do anything */
break;
}
handle_modeb(block, selector, get_Proj_proj(proj), env);
/* this should be an IF, check this */
- if (get_irn_op(selector) != op_Proj)
+ if (! is_Proj(selector))
return;
cmp = get_Proj_pred(selector);
- if (get_irn_op(cmp) != op_Cmp)
+ if (! is_Cmp(cmp))
return;
pnc = get_Proj_proj(selector);
env_t env;
int edges_active = edges_activated(irg);
+ remove_critical_cf_edges(irg);
+
/* we need dominance info */
assure_doms(irg);
*/
static void rem_Confirm(ir_node *n, void *env) {
(void) env;
- if (get_irn_op(n) == op_Confirm) {
+ if (is_Confirm(n)) {
ir_node *value = get_Confirm_value(n);
if (value != n)
exchange(n, value);