2008-08-11 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mono / mini / abcremoval.c
index c9764bad0589ea89cbe3c6552a7bf5fe457c749a..8331ce84fbe92dedc24e51da4ecf09ed97313fbb 100644 (file)
 #include <mono/metadata/mempool.h>
 #include <mono/metadata/opcodes.h>
 
+#include "config.h"
+
+#ifndef DISABLE_SSA
+
 #include "inssel.h"
 
 #include "abcremoval.h"
@@ -460,6 +464,9 @@ handle_load:
                summarize_array_value (area, value->inst_left, result, TRUE);
                value_kind = MONO_UNSIGNED_INTEGER_VALUE_SIZE_4;
                break;
+       case OP_LCONV_TO_I4:
+               value_kind = summarize_integer_value (area, value->inst_left, result, result_value_kind);
+               break;
        case OP_PHI:
                result->type = MONO_PHI_SUMMARIZED_VALUE;
                result->value.phi.number_of_alternatives = *(value->inst_phi_args);
@@ -1237,7 +1244,7 @@ process_block (MonoBasicBlock *bb, MonoVariableRelationsEvaluationArea *area) {
        int inst_index;
        MonoInst *current_inst;
        MonoAdditionalVariableRelationsForBB additional_relations;
-       GList *dominated_bb;
+       GSList *dominated_bb;
        
        if (TRACE_ABC_REMOVAL) {
                printf ("Processing block %d [dfn %d]...\n", bb->block_num, bb->dfn);
@@ -1260,16 +1267,13 @@ process_block (MonoBasicBlock *bb, MonoVariableRelationsEvaluationArea *area) {
        apply_change_to_evaluation_area (area, &(additional_relations.relation2));
        
        inst_index = 0;
-       current_inst = bb->code;
-       while (current_inst != NULL) {
+       MONO_BB_FOR_EACH_INS (bb, current_inst) {
                if (TRACE_ABC_REMOVAL) {
                        printf ("Processing instruction %d\n", inst_index);
                        inst_index++;
                }
                
                process_inst (current_inst, area);
-               
-               current_inst = current_inst->next;
        }
        
        
@@ -1277,7 +1281,7 @@ process_block (MonoBasicBlock *bb, MonoVariableRelationsEvaluationArea *area) {
                printf ("Processing block %d [dfn %d] done.\n", bb->block_num, bb->dfn);
        }
        
-       for (dominated_bb = g_list_first (bb->dominated); dominated_bb != NULL; dominated_bb = g_list_next (dominated_bb)) {
+       for (dominated_bb = bb->dominated; dominated_bb != NULL; dominated_bb = dominated_bb->next) {
                process_block ((MonoBasicBlock*) (dominated_bb->data), area);
        }
        
@@ -1317,18 +1321,18 @@ mono_perform_abc_removal (MonoCompile *cfg)
        
        area.cfg = cfg;
        area.relations = (MonoSummarizedValueRelation *)
-               alloca (sizeof (MonoSummarizedValueRelation) * (cfg->num_varinfo) * 2);
+               mono_mempool_alloc (cfg->mempool, sizeof (MonoSummarizedValueRelation) * (cfg->num_varinfo) * 2);
        area.contexts = (MonoRelationsEvaluationContext *)
-               alloca (sizeof (MonoRelationsEvaluationContext) * (cfg->num_varinfo));
+               mono_mempool_alloc (cfg->mempool, sizeof (MonoRelationsEvaluationContext) * (cfg->num_varinfo));
        area.variable_value_kind = (MonoIntegerValueKind *)
-               alloca (sizeof (MonoIntegerValueKind) * (cfg->num_varinfo));
+               mono_mempool_alloc (cfg->mempool, sizeof (MonoIntegerValueKind) * (cfg->num_varinfo));
        for (i = 0; i < cfg->num_varinfo; i++) {
                area.variable_value_kind [i] = MONO_UNKNOWN_INTEGER_VALUE;
                area.relations [i].relation = MONO_EQ_RELATION;
                area.relations [i].relation_is_static_definition = TRUE;
                area.relations [i].next = NULL;
-               if (cfg->vars [i]->def != NULL) {
-                       MonoInst *value = get_variable_value_from_store_instruction (cfg->vars [i]->def, i);
+               if (MONO_VARINFO (cfg, i)->def != NULL) {
+                       MonoInst *value = get_variable_value_from_store_instruction (MONO_VARINFO (cfg, i)->def, i);
                        if (value != NULL) {
                                gboolean is_array_type;
                                MonoIntegerValueKind effective_value_kind;
@@ -1386,7 +1390,7 @@ handle_integer_value:
                                        apply_value_kind_to_range (&range, effective_value_kind);
                                        
                                        if (range.upper < INT_MAX) {
-                                               type_relation = (MonoSummarizedValueRelation *) alloca (sizeof (MonoSummarizedValueRelation));
+                                               type_relation = (MonoSummarizedValueRelation *) mono_mempool_alloc (cfg->mempool, sizeof (MonoSummarizedValueRelation));
                                                type_relation->relation = MONO_LE_RELATION;
                                                type_relation->related_value.type = MONO_CONSTANT_SUMMARIZED_VALUE;
                                                type_relation->related_value.value.constant.value = range.upper;
@@ -1398,7 +1402,7 @@ handle_integer_value:
                                                }
                                        }
                                        if (range.lower > INT_MIN) {
-                                               type_relation = (MonoSummarizedValueRelation *) alloca (sizeof (MonoSummarizedValueRelation));
+                                               type_relation = (MonoSummarizedValueRelation *) mono_mempool_alloc (cfg->mempool, sizeof (MonoSummarizedValueRelation));
                                                type_relation->relation = MONO_GE_RELATION;
                                                type_relation->related_value.type = MONO_CONSTANT_SUMMARIZED_VALUE;
                                                type_relation->related_value.value.constant.value = range.lower;
@@ -1458,3 +1462,6 @@ handle_integer_value:
        
        process_block (cfg->bblocks [0], &area);
 }
+
+#endif /* DISABLE_SSA */
+