Author: zoltan
Date: 2007-05-04 16:17:37 -0400 (Fri, 04 May 2007)
New Revision: 76725
Modified:
branches/vargaz/mini-linear-il/mono/mono/mini/ChangeLog
branches/vargaz/mini-linear-il/mono/mono/mini/abcremoval2.c
Log:
2007-05-04 Zoltan Varga <[EMAIL PROTECTED]>
* abcremoval2.c (get_relation_from_ins): Handle OP_IREM_UN as in bug
#71576.
Modified: branches/vargaz/mini-linear-il/mono/mono/mini/ChangeLog
===================================================================
--- branches/vargaz/mini-linear-il/mono/mono/mini/ChangeLog 2007-05-04
20:01:01 UTC (rev 76724)
+++ branches/vargaz/mini-linear-il/mono/mono/mini/ChangeLog 2007-05-04
20:17:37 UTC (rev 76725)
@@ -1,5 +1,7 @@
2007-05-04 Zoltan Varga <[EMAIL PROTECTED]>
+ * abcremoval2.c (get_relation_from_ins): Handle OP_IREM_UN as in bug
#71576.
+
* mini-ops.h: Add OP_NEWARR.
* method-to-ir.c: Decompose CEE_NEWARR after abcrem.
Modified: branches/vargaz/mini-linear-il/mono/mono/mini/abcremoval2.c
===================================================================
--- branches/vargaz/mini-linear-il/mono/mono/mini/abcremoval2.c 2007-05-04
20:01:01 UTC (rev 76724)
+++ branches/vargaz/mini-linear-il/mono/mono/mini/abcremoval2.c 2007-05-04
20:17:37 UTC (rev 76725)
@@ -237,14 +237,19 @@
}
/*
- * Given a MonoInst representing an integer value, store it in "summarized"
form.
+ * get_relation_from_ins:
+ *
+ * Obtain relations from a MonoInst.
+ *
* result_value_kind: the "expected" kind of result;
* result: the "summarized" value
* returns the "actual" kind of result, if guessable (otherwise
MONO_UNKNOWN_INTEGER_VALUE)
*/
static MonoIntegerValueKind
-summarize_integer_value (MonoVariableRelationsEvaluationArea *area, MonoInst
*ins, MonoSummarizedValue *result, MonoIntegerValueKind result_value_kind) {
+get_relation_from_ins (MonoVariableRelationsEvaluationArea *area, MonoInst
*ins, MonoSummarizedValueRelation *result, MonoIntegerValueKind
result_value_kind)
+{
MonoIntegerValueKind value_kind;
+ MonoSummarizedValue *value = &result->related_value;
if (ins->type == STACK_I8) {
value_kind = MONO_INTEGER_VALUE_SIZE_8;
@@ -254,54 +259,65 @@
value_kind = MONO_UNKNOWN_INTEGER_VALUE;
}
+ result->relation = MONO_EQ_RELATION;
+ MAKE_VALUE_ANY (*value);
+
switch (ins->opcode) {
case OP_ICONST:
- result->type = MONO_CONSTANT_SUMMARIZED_VALUE;
- result->value.constant.value = ins->inst_c0;
+ value->type = MONO_CONSTANT_SUMMARIZED_VALUE;
+ value->value.constant.value = ins->inst_c0;
break;
case OP_MOVE:
- result->type = MONO_VARIABLE_SUMMARIZED_VALUE;
- result->value.variable.variable = ins->sreg1;
- result->value.variable.delta = 0;
+ value->type = MONO_VARIABLE_SUMMARIZED_VALUE;
+ value->value.variable.variable = ins->sreg1;
+ value->value.variable.delta = 0;
break;
case OP_PHI:
- result->type = MONO_PHI_SUMMARIZED_VALUE;
- result->value.phi.number_of_alternatives =
*(ins->inst_phi_args);
- result->value.phi.phi_alternatives = ins->inst_phi_args + 1;
+ value->type = MONO_PHI_SUMMARIZED_VALUE;
+ value->value.phi.number_of_alternatives = *(ins->inst_phi_args);
+ value->value.phi.phi_alternatives = ins->inst_phi_args + 1;
break;
case OP_IADD_IMM:
- result->type = MONO_VARIABLE_SUMMARIZED_VALUE;
- result->value.variable.variable = ins->sreg1;
- result->value.variable.delta = ins->inst_imm;
+ value->type = MONO_VARIABLE_SUMMARIZED_VALUE;
+ value->value.variable.variable = ins->sreg1;
+ value->value.variable.delta = ins->inst_imm;
/* FIXME: */
//check_delta_safety (area, result);
break;
case OP_ISUB_IMM:
- result->type = MONO_VARIABLE_SUMMARIZED_VALUE;
- result->value.variable.variable = ins->sreg1;
- result->value.variable.delta = ins->inst_imm;
+ value->type = MONO_VARIABLE_SUMMARIZED_VALUE;
+ value->value.variable.variable = ins->sreg1;
+ value->value.variable.delta = ins->inst_imm;
/* FIXME: */
//check_delta_safety (area, result);
break;
+ case OP_IREM_UN:
+ /* The result of an unsigned remainder is 0 < x < the divisor */
+ result->relation = MONO_LT_RELATION;
+ value->type = MONO_VARIABLE_SUMMARIZED_VALUE;
+ value->value.variable.variable = ins->sreg2;
+ value->value.variable.delta = 0;
+ value_kind = MONO_UNSIGNED_INTEGER_VALUE_SIZE_4;
+ break;
case OP_LDLEN:
/*
* We represent arrays by their length, so r1<-ldlen r2 is
stored
* as r1 == r2 in the evaluation graph.
*/
- result->type = MONO_VARIABLE_SUMMARIZED_VALUE;
- result->value.variable.variable = ins->sreg1;
- result->value.variable.delta = 0;
+ value->type = MONO_VARIABLE_SUMMARIZED_VALUE;
+ value->value.variable.variable = ins->sreg1;
+ value->value.variable.delta = 0;
value_kind = MONO_UNSIGNED_INTEGER_VALUE_SIZE_4;
break;
case OP_NEWARR:
- result->type = MONO_VARIABLE_SUMMARIZED_VALUE;
- result->value.variable.variable = ins->sreg1;
- result->value.variable.delta = 0;
+ value->type = MONO_VARIABLE_SUMMARIZED_VALUE;
+ value->value.variable.variable = ins->sreg1;
+ value->value.variable.delta = 0;
break;
/* FIXME: Add more opcodes */
default:
- MAKE_VALUE_ANY (*result);
+ break;
}
return value_kind;
}
@@ -1109,7 +1125,7 @@
if (var)
area.variable_value_kind [ins->dreg] =
type_to_value_kind (var->inst_vtype);
- effective_value_kind = summarize_integer_value
(&area, ins, &(area.relations [ins->dreg].related_value),
area.variable_value_kind [ins->dreg]);
+ effective_value_kind = get_relation_from_ins
(&area, ins, &area.relations [ins->dreg], area.variable_value_kind [ins->dreg]);
MONO_MAKE_RELATIONS_EVALUATION_RANGE_WEAK
(range);
apply_value_kind_to_range (&range,
area.variable_value_kind [i]);
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches