#include <string.h>
#include <stdio.h>
#include <math.h>
+#ifdef HAVE_ALLOCA_H
+#include <alloca.h>
+#endif
#include <mono/metadata/debug-helpers.h>
#include <mono/metadata/opcodes.h>
-#include "inssel.h"
+#include "config.h"
#include "ssapre.h"
+/* Disable for now to save space since it is not yet ported to linear IR */
+#if 0
+
+#ifndef DISABLE_SSA
+
/* Logging conditions */
#define DUMP_LEVEL (4)
#define TRACE_LEVEL (3)
MonoInst *current_inst;
print_bb_info (current_bb, TRUE);
- for (current_inst = current_bb->bb->code; current_inst != NULL; current_inst = current_inst->next) {
+ MONO_BB_FOR_EACH_INS (current_bb->bb, current_inst)
mono_print_tree_nl (current_inst);
- }
}
}
result->left_argument = expression->left_argument;
} else {
result->left_argument.type = MONO_SSAPRE_EXPRESSION_ARGUMENT_ORIGINAL_VARIABLE;
- original_variable = cfg->vars [expression->left_argument.argument.ssa_variable]->reg;
+ original_variable = MONO_VARINFO (cfg, expression->left_argument.argument.ssa_variable)->reg;
if (original_variable >= 0) {
result->left_argument.argument.original_variable = original_variable;
} else {
result->right_argument = expression->right_argument;
} else {
result->right_argument.type = MONO_SSAPRE_EXPRESSION_ARGUMENT_ORIGINAL_VARIABLE;
- original_variable = cfg->vars [expression->right_argument.argument.ssa_variable]->reg;
+ original_variable = MONO_VARINFO (cfg, expression->right_argument.argument.ssa_variable)->reg;
if (original_variable >= 0) {
result->right_argument.argument.original_variable = original_variable;
} else {
* Given a variable index, checks if it is a phi definition
* (it assumes the "area" is visible).
*/
-#define IS_PHI_DEFINITION(v) is_phi_definition (area->cfg->vars [v]->def)
+#define IS_PHI_DEFINITION(v) is_phi_definition (MONO_VARINFO (area->cfg, v)->def)
/*
* Given a variable index, checks if it is a phi definition.
*/
static int*
get_phi_definition (MonoCompile *cfg, gssize variable) {
- MonoInst *definition = cfg->vars [variable]->def;
+ MonoInst *definition = MONO_VARINFO (cfg, variable)->def;
if (is_phi_definition (definition) && (definition->inst_left->inst_c0 == variable)) {
return definition->inst_right->inst_phi_args;
} else {
*/
static MonoSsapreBBInfo*
get_bb_info_of_definition (MonoSsapreWorkArea *area, gssize variable) {
- MonoBasicBlock *def_bb = area->cfg->vars [variable]->def_bb;
+ MonoBasicBlock *def_bb = MONO_VARINFO (area->cfg, variable)->def_bb;
if (def_bb != NULL) {
return area->bb_infos_in_cfg_dfn_order [def_bb->dfn];
} else {
bb_info->phi_insertion_point = NULL;
- current_inst = bb->code;
previous_inst = NULL;
- while (current_inst != NULL) {
+ MONO_BB_FOR_EACH_INS (bb, current_inst) {
/* Ugly hack to fix missing variable definitions */
/* (the SSA construction code should have done it already!) */
switch (current_inst->opcode) {
if ((current_inst->inst_left->opcode == OP_LOCAL) || (current_inst->inst_left->opcode == OP_ARG)) {
int variable_index = current_inst->inst_left->inst_c0;
- if (area->cfg->vars [variable_index]->def_bb == NULL) {
+ if (MONO_VARINFO (area->cfg, variable_index)->def_bb == NULL) {
if (area->cfg->verbose_level >= 4) {
printf ("SSAPRE WARNING: variable %d has no definition, fixing.\n", variable_index);
}
- area->cfg->vars [variable_index]->def_bb = bb_info->bb;
+ MONO_VARINFO (area->cfg, variable_index)->def_bb = bb_info->bb;
}
}
break;
}
previous_inst = current_inst;
- current_inst = current_inst->next;
}
if (current_depth > area->dt_depth) {
int* phi_definition = get_phi_definition (area->cfg, variable);
if (phi_definition != NULL) {
- int definition_bb = area->cfg->vars [variable]->def_bb->dfn;
+ int definition_bb = MONO_VARINFO (area->cfg, variable)->def_bb->dfn;
if (! mono_bitset_test (phi_bbs, definition_bb)) {
int i;
mono_bitset_set (phi_bbs, definition_bb);
if (original_variable_index == BOTTOM_REDUNDANCY_CLASS) {
original_variable_index = new_var->inst_c0;
}
- area->cfg->vars [new_var->inst_c0]->reg = original_variable_index;
- area->cfg->vars [new_var->inst_c0]->def_bb = current_bb->bb;
+ MONO_VARINFO (area->cfg, new_var->inst_c0)->reg = original_variable_index;
+ MONO_VARINFO (area->cfg, new_var->inst_c0)->def_bb = current_bb->bb;
} else {
current_bb->phi_variable_index = BOTTOM_REDUNDANCY_CLASS;
}
if (original_variable_index == BOTTOM_REDUNDANCY_CLASS) {
original_variable_index = new_var->inst_c0;
}
- area->cfg->vars [new_var->inst_c0]->reg = original_variable_index;
- area->cfg->vars [new_var->inst_c0]->def_bb = current_bb->bb;
+ MONO_VARINFO (area->cfg, new_var->inst_c0)->reg = original_variable_index;
+ MONO_VARINFO (area->cfg, new_var->inst_c0)->def_bb = current_bb->bb;
} else {
current_expression->variable_index = BOTTOM_REDUNDANCY_CLASS;
}
if (original_variable_index == BOTTOM_REDUNDANCY_CLASS) {
original_variable_index = new_var->inst_c0;
}
- area->cfg->vars [new_var->inst_c0]->reg = original_variable_index;
- area->cfg->vars [new_var->inst_c0]->def_bb = current_bb->bb;
+ MONO_VARINFO (area->cfg, new_var->inst_c0)->reg = original_variable_index;
+ MONO_VARINFO (area->cfg, new_var->inst_c0)->def_bb = current_bb->bb;
} else {
current_bb->phi_argument_variable_index = BOTTOM_REDUNDANCY_CLASS;
}
int in_bb;
NEW_INST (phi, OP_PHI);
- phi->inst_c0 = area->cfg->vars [current_bb->phi_variable_index]->reg;
+ phi->inst_c0 = MONO_VARINFO (area->cfg, current_bb->phi_variable_index)->reg;
phi->inst_phi_args = mono_mempool_alloc (area->cfg->mempool, (sizeof (int) * ((current_bb->in_count) + 1)));
phi->inst_phi_args [0] = current_bb->in_count;
for (in_bb = 0; in_bb < current_bb->in_count; in_bb++) {
store->next = current_bb->bb->code;
current_bb->bb->code = store;
}
- area->cfg->vars [current_bb->phi_variable_index]->def = store;
+ MONO_VARINFO (area->cfg, current_bb->phi_variable_index)->def = store;
current_bb->phi_insertion_point = store;
area->added_phis ++;
store->next = current_bb->bb->code;
current_bb->bb->code = store;
}
- area->cfg->vars [current_expression->variable_index]->def = store;
+ MONO_VARINFO (area->cfg, current_expression->variable_index)->def = store;
mono_compile_make_var_load (area->cfg, current_expression->occurrence, current_expression->variable_index);
if (current_expression->father_in_tree != NULL) {
handle_father_expression (area, current_expression, store);
inserted_expression = create_expression (area, &expression_description, &prototype_occurrence);
store = mono_compile_create_var_store (area->cfg, current_bb->phi_argument_variable_index, inserted_expression);
- area->cfg->vars [current_bb->phi_argument_variable_index]->def = store;
+ MONO_VARINFO (area->cfg, current_bb->phi_argument_variable_index)->def = store;
store->next = NULL;
mono_add_ins_to_end (current_bb->bb, store);
printf ("SSAPRE STARTS PROCESSING METHOD %s\n", mono_method_full_name (cfg->method, TRUE));
}
if (area.cfg->verbose_level >= DUMP_LEVEL) {
- printf ("BEFORE SSAPRE START\n");
- mono_print_code (area.cfg);
- printf ("BEFORE SSAPRE END\n");
+ mono_print_code (area.cfg, "BEFORE SSAPRE");
}
area.first_in_queue = NULL;
}
if (area.cfg->verbose_level >= DUMP_LEVEL) {
- printf ("AFTER SSAPRE START\n");
- mono_print_code (area.cfg);
- printf ("AFTER SSAPRE END\n");
+ mono_print_code (area.cfg, "AFTER SSAPRE");
}
if (area.cfg->verbose_level >= TRACE_LEVEL) {
printf ("SSAPRE ENDS PROCESSING METHOD %s\n", mono_method_full_name (cfg->method, TRUE));
mono_mempool_destroy (area.mempool);
}
+
+#endif /* DISABLE_SSA */
+
+#else /* 0 */
+
+void
+mono_perform_ssapre (MonoCompile *cfg)
+{
+}
+
+#endif /* 0 */