* - The only nodes producing mode_b are: Proj(Cmp) and ConvB(X) (where X
* is some mode that can be converted to the lowered mode).
* ConvB will usually be implemented by a comparison with 0 producing some
- * flags in the backends.
+ * flags in the backends. It's debatable wether ConvB(X) is a goode idea.
+ * Maybe we should rather introduce a Test node.
* All other former uses should be converted to manipulations with an integer
* mode that was specified in the pass configuration.
*/
{
dbg_info *dbgi = get_irn_dbg_info(node);
ir_node *block = get_nodes_block(node);
- ir_mode *mode = config.lowered_mode;
+ ir_mode *mode = config.lowered_mode;
ir_node *res;
assert(get_irn_mode(node) == mode_b);
arity = get_irn_arity(node);
in = ALLOCAN(ir_node*, arity);
- unknown = new_Unknown(config.lowered_mode);
+ unknown = new_Unknown(mode);
for (i = 0; i < arity; ++i) {
in[i] = unknown;
}
- new_phi = new_r_Phi(block, arity, in, config.lowered_mode);
+ new_phi = new_r_Phi(block, arity, in, mode);
set_irn_link(node, new_phi);
pdeq_putr(lowered_nodes, node);
set_irn_n(copy, i, low_in);
}
- set_irn_mode(copy, config.lowered_mode);
+ set_irn_mode(copy, mode);
set_irn_link(node, copy);
pdeq_putr(lowered_nodes, node);
return copy;
}
+
case iro_Not: {
ir_node *op = get_Not_op(node);
ir_node *low_op = lower_node(op);
pdeq_putr(lowered_nodes, node);
return res;
}
+
case iro_Mux: {
ir_node *cond = get_Mux_sel(node);
ir_node *low_cond = lower_node(cond);
pdeq_putr(lowered_nodes, node);
return or;
}
+
case iro_Conv: {
ir_node *pred = get_Conv_op(node);
ir_mode *mode = get_irn_mode(pred);
pdeq_putr(lowered_nodes, node);
return set;
}
+
case iro_Proj: {
ir_node *pred = get_Proj_pred(node);
panic("unexpected projb: %+F (pred: %+F)", node, pred);
}
+
case iro_Const: {
tarval *tv = get_Const_tarval(node);
if (tv == get_tarval_b_true()) {
pdeq_putr(lowered_nodes, node);
return res;
}
+
case iro_Unknown:
- return new_Unknown(config.lowered_mode);
+ return new_Unknown(mode);
+
default:
panic("didn't expect %+F to have mode_b", node);
}
}
}
-static void clear_links(ir_node *node, void *env)
-{
- (void) env;
- set_irn_link(node, NULL);
-}
-
void ir_lower_mode_b(ir_graph *irg, const lower_mode_b_config_t *nconfig)
{
ir_entity *entity = get_irg_entity(irg);
adjust_method_type(type);
set_opt_allow_conv_b(0);
- irg_walk_graph(irg, clear_links, NULL, NULL);
+ irg_walk_graph(irg, firm_clear_link, NULL, NULL);
irg_walk_graph(irg, lower_mode_b_walker, NULL, NULL);
while(!pdeq_empty(lowered_nodes)) {