diff --git a/src/mono/mono/mini/interp/interp.c b/src/mono/mono/mini/interp/interp.c
index f33fb62a743b6..6db2f621167d9 100644
--- a/src/mono/mono/mini/interp/interp.c
+++ b/src/mono/mono/mini/interp/interp.c
@@ -5808,7 +5808,7 @@ MINT_IN_CASE(MINT_BRTRUE_I8_SP) ZEROP_SP(gint64, !=); MINT_IN_BREAK;
}
MINT_IN_CASE(MINT_CONV_OVF_I4_R8) {
double val = LOCAL_VAR (ip [2], double);
- if (mono_isnan (val) || mono_trunc (val) != (gint32)val)
+ if (val < G_MININT32 || val > G_MAXINT32 || isnan (val))
THROW_EX (mono_get_exception_overflow (), ip);
LOCAL_VAR (ip [1], gint32) = (gint32)val;
ip += 3;
@@ -5840,7 +5840,7 @@ MINT_IN_CASE(MINT_BRTRUE_I8_SP) ZEROP_SP(gint64, !=); MINT_IN_BREAK;
}
MINT_IN_CASE(MINT_CONV_OVF_U4_R8) {
double val = LOCAL_VAR (ip [2], double);
- if (mono_isnan (val) || mono_trunc (val) != (guint32)val)
+ if (val < 0 || val > G_MAXUINT32 || isnan (val))
THROW_EX (mono_get_exception_overflow (), ip);
LOCAL_VAR (ip [1], gint32) = (guint32) val;
ip += 3;
@@ -5880,7 +5880,7 @@ MINT_IN_CASE(MINT_BRTRUE_I8_SP) ZEROP_SP(gint64, !=); MINT_IN_BREAK;
}
MINT_IN_CASE(MINT_CONV_OVF_I2_R4) {
float val = LOCAL_VAR (ip [2], float);
- if (mono_isnan (val) || mono_trunc (val) != (gint16)val)
+ if (val < G_MININT16 || val > G_MAXINT16 || isnan (val))
THROW_EX (mono_get_exception_overflow (), ip);
LOCAL_VAR (ip [1], gint32) = (gint16) val;
ip += 3;
@@ -5888,7 +5888,7 @@ MINT_IN_CASE(MINT_BRTRUE_I8_SP) ZEROP_SP(gint64, !=); MINT_IN_BREAK;
}
MINT_IN_CASE(MINT_CONV_OVF_I2_R8) {
double val = LOCAL_VAR (ip [2], double);
- if (mono_isnan (val) || mono_trunc (val) != (gint16)val)
+ if (val < G_MININT16 || val > G_MAXINT16 || isnan (val))
THROW_EX (mono_get_exception_overflow (), ip);
LOCAL_VAR (ip [1], gint32) = (gint16) val;
ip += 3;
@@ -5912,7 +5912,7 @@ MINT_IN_CASE(MINT_BRTRUE_I8_SP) ZEROP_SP(gint64, !=); MINT_IN_BREAK;
}
MINT_IN_CASE(MINT_CONV_OVF_U2_R4) {
float val = LOCAL_VAR (ip [2], float);
- if (mono_isnan (val) || mono_trunc (val) != (guint16)val)
+ if (val < 0 || val > G_MAXUINT16 || isnan (val))
THROW_EX (mono_get_exception_overflow (), ip);
LOCAL_VAR (ip [1], gint32) = (guint16) val;
ip += 3;
@@ -5920,7 +5920,7 @@ MINT_IN_CASE(MINT_BRTRUE_I8_SP) ZEROP_SP(gint64, !=); MINT_IN_BREAK;
}
MINT_IN_CASE(MINT_CONV_OVF_U2_R8) {
double val = LOCAL_VAR (ip [2], double);
- if (mono_isnan (val) || mono_trunc (val) != (guint16)val)
+ if (val < 0 || val > G_MAXUINT16 || isnan (val))
THROW_EX (mono_get_exception_overflow (), ip);
LOCAL_VAR (ip [1], gint32) = (guint16) val;
ip += 3;
@@ -5960,7 +5960,7 @@ MINT_IN_CASE(MINT_BRTRUE_I8_SP) ZEROP_SP(gint64, !=); MINT_IN_BREAK;
}
MINT_IN_CASE(MINT_CONV_OVF_I1_R4) {
float val = LOCAL_VAR (ip [2], float);
- if (mono_isnan (val) || mono_trunc (val) != (gint8)val)
+ if (val < G_MININT8 || val > G_MAXINT8 || isnan (val))
THROW_EX (mono_get_exception_overflow (), ip);
LOCAL_VAR (ip [1], gint32) = (gint8) val;
ip += 3;
@@ -5968,7 +5968,7 @@ MINT_IN_CASE(MINT_BRTRUE_I8_SP) ZEROP_SP(gint64, !=); MINT_IN_BREAK;
}
MINT_IN_CASE(MINT_CONV_OVF_I1_R8) {
double val = LOCAL_VAR (ip [2], double);
- if (mono_isnan (val) || mono_trunc (val) != (gint8)val)
+ if (val < G_MININT8 || val > G_MAXINT8 || isnan (val))
THROW_EX (mono_get_exception_overflow (), ip);
LOCAL_VAR (ip [1], gint32) = (gint8) val;
ip += 3;
@@ -5992,7 +5992,7 @@ MINT_IN_CASE(MINT_BRTRUE_I8_SP) ZEROP_SP(gint64, !=); MINT_IN_BREAK;
}
MINT_IN_CASE(MINT_CONV_OVF_U1_R4) {
float val = LOCAL_VAR (ip [2], float);
- if (mono_isnan (val) || mono_trunc (val) != (guint8)val)
+ if (val < 0 || val > G_MAXUINT8 || isnan (val))
THROW_EX (mono_get_exception_overflow (), ip);
LOCAL_VAR (ip [1], gint32) = (guint8) val;
ip += 3;
@@ -6000,7 +6000,7 @@ MINT_IN_CASE(MINT_BRTRUE_I8_SP) ZEROP_SP(gint64, !=); MINT_IN_BREAK;
}
MINT_IN_CASE(MINT_CONV_OVF_U1_R8) {
double val = LOCAL_VAR (ip [2], double);
- if (mono_isnan (val) || mono_trunc (val) != (guint8)val)
+ if (val < 0 || val > G_MAXUINT8 || isnan (val))
THROW_EX (mono_get_exception_overflow (), ip);
LOCAL_VAR (ip [1], gint32) = (guint8) val;
ip += 3;
diff --git a/src/mono/mono/mini/local-propagation.c b/src/mono/mono/mini/local-propagation.c
index 19801edd1f281..3bd878e66b56a 100644
--- a/src/mono/mono/mini/local-propagation.c
+++ b/src/mono/mono/mini/local-propagation.c
@@ -223,7 +223,7 @@ mono_strength_reduction_division (MonoCompile *cfg, MonoInst *ins)
guint32 tmp_regi;
#endif
struct magic_signed mag;
- int power2 = (ins->inst_imm > 0) ? mono_is_power_of_two (ins->inst_imm) : -1;
+ int power2 = mono_is_power_of_two (ins->inst_imm);
/* The decomposition doesn't handle exception throwing */
/* Optimization with MUL does not apply for -1, 0 and 1 divisors */
if (ins->inst_imm == 0 || ins->inst_imm == -1) {
@@ -350,7 +350,7 @@ mono_strength_reduction_ins (MonoCompile *cfg, MonoInst *ins, const char **spec)
ins->opcode = OP_INEG;
} else if ((ins->opcode == OP_LMUL_IMM) && (ins->inst_imm == -1)) {
ins->opcode = OP_LNEG;
- } else if (ins->inst_imm > 0) {
+ } else {
int power2 = mono_is_power_of_two (ins->inst_imm);
if (power2 >= 0) {
ins->opcode = (ins->opcode == OP_MUL_IMM) ? OP_SHL_IMM : ((ins->opcode == OP_LMUL_IMM) ? OP_LSHL_IMM : OP_ISHL_IMM);
diff --git a/src/mono/mono/mini/mini-arm.c b/src/mono/mono/mini/mini-arm.c
index f22ba5b5a4a3b..58c0cef04842e 100644
--- a/src/mono/mono/mini/mini-arm.c
+++ b/src/mono/mono/mini/mini-arm.c
@@ -3466,7 +3466,7 @@ mono_arch_lowering_pass (MonoCompile *cfg, MonoBasicBlock *bb)
ins->inst_c0 = 0;
break;
}
- imm8 = (ins->inst_imm > 0) ? mono_is_power_of_two (ins->inst_imm) : -1;
+ imm8 = mono_is_power_of_two (ins->inst_imm);
if (imm8 > 0) {
ins->opcode = OP_SHL_IMM;
ins->inst_imm = imm8;
diff --git a/src/mono/mono/mini/mini-mips.c b/src/mono/mono/mini/mini-mips.c
index b77252e751571..9a353ce85fa1e 100644
--- a/src/mono/mono/mini/mini-mips.c
+++ b/src/mono/mono/mini/mini-mips.c
@@ -1987,7 +1987,7 @@ mono_arch_peephole_pass_2 (MonoCompile *cfg, MonoBasicBlock *bb)
MONO_DELETE_INS (bb, ins);
continue;
}
- } else if (ins->inst_imm > 0) {
+ } else {
int power2 = mono_is_power_of_two (ins->inst_imm);
if (power2 > 0) {
ins->opcode = OP_SHL_IMM;
@@ -2666,7 +2666,7 @@ mono_arch_lowering_pass (MonoCompile *cfg, MonoBasicBlock *bb)
ins->inst_c0 = 0;
break;
}
- imm = (ins->inst_imm > 0) ? mono_is_power_of_two (ins->inst_imm) : -1;
+ imm = mono_is_power_of_two (ins->inst_imm);
if (imm > 0) {
ins->opcode = OP_SHL_IMM;
ins->inst_imm = imm;
diff --git a/src/mono/mono/mini/mini-ppc.c b/src/mono/mono/mini/mini-ppc.c
index e3de468cbac11..19097c9df89d9 100644
--- a/src/mono/mono/mini/mini-ppc.c
+++ b/src/mono/mono/mini/mini-ppc.c
@@ -1963,7 +1963,7 @@ mono_arch_peephole_pass_2 (MonoCompile *cfg, MonoBasicBlock *bb)
MONO_DELETE_INS (bb, ins);
continue;
}
- } else if (inst->inst_imm > 0) {
+ } else {
int power2 = mono_is_power_of_two (ins->inst_imm);
if (power2 > 0) {
ins->opcode = OP_SHL_IMM;
@@ -2537,7 +2537,7 @@ mono_arch_lowering_pass (MonoCompile *cfg, MonoBasicBlock *bb)
ins->inst_c0 = 0;
break;
}
- imm = (ins->inst_imm > 0) ? mono_is_power_of_two (ins->inst_imm) : -1;
+ imm = mono_is_power_of_two (ins->inst_imm);
if (imm > 0) {
ins->opcode = OP_SHL_IMM;
ins->inst_imm = imm;
diff --git a/src/tests/issues.targets b/src/tests/issues.targets
index 64cf26f78662e..3712feb3d7731 100644
--- a/src/tests/issues.targets
+++ b/src/tests/issues.targets
@@ -965,9 +965,27 @@
+
+ https://github.com/dotnet/runtime/issues/51323
+
+
+ https://github.com/dotnet/runtime/issues/51323
+
Mono does not define out of range fp to int conversions
+
+ https://github.com/dotnet/runtime/issues/51323
+
+
+ https://github.com/dotnet/runtime/issues/51323
+
+
+ https://github.com/dotnet/runtime/issues/51323
+
+
+ https://github.com/dotnet/runtime/issues/51323
+
https://github.com/dotnet/runtime/issues/48190
@@ -1221,6 +1239,9 @@
needs triage
+
+ https://github.com/dotnet/runtime/issues/51323
+
needs triage