# include "firmstat.h"
typedef struct _walker_t {
- int bits;
- ir_mode *s_mode; /**< signed mode */
- ir_mode *u_mode; /**< unsigned mode */
- int changes;
+ int bits; /**< number of bits in the destination mode */
+ ir_mode *s_mode; /**< signed destination mode */
+ ir_mode *u_mode; /**< unsigned destination mode */
+ int changes; /**< non-zero if the graph was changed */
} walker_t;
/**
{
switch (get_irn_opcode(node)) {
case iro_Proj:
+ /* Args, Load, Div, Mod */
case iro_Conv:
+ /* Hmm, maybe the Conv should be replaced */
case iro_Rot: {
ir_node *block = get_nodes_block(node);
/**
* Add a Conv node where needed on input
*/
-static ir_node *fix_irn_input(opcode code, ir_node *block, ir_node *pred, ir_mode *mode)
+static ir_node *fix_irn_input(ir_opcode code, ir_node *block, ir_node *pred, ir_mode *mode)
{
switch (code) {
case iro_DivMod:
*/
static void fix_mode(ir_node *n, ir_mode *mode)
{
- opcode code = get_irn_opcode(n);
+ ir_opcode code = get_irn_opcode(n);
if (code == iro_Proj) {
code = get_irn_opcode(get_Proj_pred(n));
}
- switch (code){
+ switch (code) {
case iro_Return:
case iro_Load:
case iro_Proj:
walker_t *wenv = env;
ir_mode *mode = get_irn_mode(n);
ir_node *block;
- opcode code;
+ ir_opcode code;
/* save the old mode, we need this info later */
set_irn_link(n, mode);
/* special case: fix the Return */
- if (get_irn_op(n) == op_Return) {
- entity *ent = get_irg_entity(current_ir_graph);
- ir_type *mt = get_entity_type(ent);
- int i, n_ress = get_method_n_ress(mt);
+ if (is_Return(n)) {
+ ir_entity *ent = get_irg_entity(current_ir_graph);
+ ir_type *mt = get_entity_type(ent);
+ int i, n_ress = get_method_n_ress(mt);
mode = mode_is_signed(mode) ? wenv->s_mode : wenv->u_mode;
block = get_nodes_block(n);
ir_node *pred = get_Conv_op(n);
ir_mode *modeA = get_irn_link(pred);
- if (get_irn_node_nr(n) == 171)
- printf("HAllo\n");
-
if (modeA != get_irn_mode(pred)) {
pred = new_r_Conv(current_ir_graph, get_nodes_block(pred), pred, modeA);
set_Conv_op(n, pred);
env.bits = get_mode_size_bits(mode);
env.changes = 0;
- assert(env.s_mode && env.u_mode && "Cpould not find modes");
+ assert(env.s_mode && env.u_mode && "Could not find modes");
irg_walk_graph(irg, NULL, do_mode_conv, &env);
- /* Handle graph state */
+ /* Handle graph state. We never change control flow. */
if (env.changes) {
- if (get_irg_outs_state(current_ir_graph) == outs_consistent)
- set_irg_outs_inconsistent(current_ir_graph);
+ set_irg_outs_inconsistent(current_ir_graph);
}
}