diff options
author | Zoltan Varga <vargaz@gmail.com> | 2013-02-19 18:24:24 +0400 |
---|---|---|
committer | Zoltan Varga <vargaz@gmail.com> | 2013-02-19 18:24:24 +0400 |
commit | 3108f76b133884dafc4ee5d385a71a74d9491bb6 (patch) | |
tree | c45c6c5428c845fb2a3ad5cd2811bc92896d3027 | |
parent | b4fd5d27555bba2d0f0031c033d99e51686381e6 (diff) |
Avoid deadce on OP_INEG since it sets the condition codes, and the OP_LNEG decomposition depends on this on x86. Fixes #10320.mono-3.0.4
-rw-r--r-- | mono/mini/basic-long.cs | 6 | ||||
-rw-r--r-- | mono/mini/mini.h | 3 |
2 files changed, 8 insertions, 1 deletions
diff --git a/mono/mini/basic-long.cs b/mono/mini/basic-long.cs index 5373a5ed92d..19c33016558 100644 --- a/mono/mini/basic-long.cs +++ b/mono/mini/basic-long.cs @@ -1190,5 +1190,11 @@ class Tests { return (value == 65526) ? 0 : 1; } } + + public static int test_0_lneg_regress_10320 () { + long a = 0x100000000; + ulong c = ((ulong) (-(-a))) >> 32; + return c == 1 ? 0 : 1; + } } diff --git a/mono/mini/mini.h b/mono/mini/mini.h index cf90fd6c46b..946bf44995f 100644 --- a/mono/mini/mini.h +++ b/mono/mini/mini.h @@ -452,7 +452,8 @@ enum { #define MONO_JUMP_TABLE_FROM_INS(ins) (((ins)->opcode == OP_JUMP_TABLE) ? (ins)->inst_p0 : (((ins)->opcode == OP_AOTCONST) && (ins->inst_i1 == (gpointer)MONO_PATCH_INFO_SWITCH) ? (ins)->inst_p0 : (((ins)->opcode == OP_SWITCH) ? (ins)->inst_p0 : ((((ins)->opcode == OP_GOT_ENTRY) && ((ins)->inst_right->inst_i1 == (gpointer)MONO_PATCH_INFO_SWITCH)) ? (ins)->inst_right->inst_p0 : NULL)))) /* FIXME: Add more instructions */ -#define MONO_INS_HAS_NO_SIDE_EFFECT(ins) (MONO_IS_MOVE (ins) || (ins->opcode == OP_ICONST) || (ins->opcode == OP_I8CONST) || MONO_IS_ZERO (ins) || (ins->opcode == OP_ADD_IMM) || (ins->opcode == OP_R8CONST) || (ins->opcode == OP_LADD_IMM) || (ins->opcode == OP_ISUB_IMM) || (ins->opcode == OP_IADD_IMM) || (ins->opcode == OP_INEG) || (ins->opcode == OP_LNEG) || (ins->opcode == OP_ISUB) || (ins->opcode == OP_CMOV_IGE) || (ins->opcode == OP_ISHL_IMM) || (ins->opcode == OP_ISHR_IMM) || (ins->opcode == OP_ISHR_UN_IMM) || (ins->opcode == OP_IAND_IMM) || (ins->opcode == OP_ICONV_TO_U1) || (ins->opcode == OP_ICONV_TO_I1) || (ins->opcode == OP_SEXT_I4) || (ins->opcode == OP_LCONV_TO_U1) || (ins->opcode == OP_ICONV_TO_U2) || (ins->opcode == OP_ICONV_TO_I2) || (ins->opcode == OP_LCONV_TO_I2) || (ins->opcode == OP_LDADDR)) +/* INEG sets the condition codes, and the OP_LNEG decomposition depends on this on x86 */ +#define MONO_INS_HAS_NO_SIDE_EFFECT(ins) (MONO_IS_MOVE (ins) || (ins->opcode == OP_ICONST) || (ins->opcode == OP_I8CONST) || MONO_IS_ZERO (ins) || (ins->opcode == OP_ADD_IMM) || (ins->opcode == OP_R8CONST) || (ins->opcode == OP_LADD_IMM) || (ins->opcode == OP_ISUB_IMM) || (ins->opcode == OP_IADD_IMM) || (ins->opcode == OP_LNEG) || (ins->opcode == OP_ISUB) || (ins->opcode == OP_CMOV_IGE) || (ins->opcode == OP_ISHL_IMM) || (ins->opcode == OP_ISHR_IMM) || (ins->opcode == OP_ISHR_UN_IMM) || (ins->opcode == OP_IAND_IMM) || (ins->opcode == OP_ICONV_TO_U1) || (ins->opcode == OP_ICONV_TO_I1) || (ins->opcode == OP_SEXT_I4) || (ins->opcode == OP_LCONV_TO_U1) || (ins->opcode == OP_ICONV_TO_U2) || (ins->opcode == OP_ICONV_TO_I2) || (ins->opcode == OP_LCONV_TO_I2) || (ins->opcode == OP_LDADDR)) #define MONO_METHOD_IS_FINAL(m) (((m)->flags & METHOD_ATTRIBUTE_FINAL) || ((m)->klass && ((m)->klass->flags & TYPE_ATTRIBUTE_SEALED))) |