else if (loop->lpFlags & LPFLG_VAR_INIT)
{
// initVar >= 0
- LC_Condition geZero(GT_GE, LC_Expr(LC_Ident(loop->lpVarInit, LC_Ident::Var)),
+ const unsigned initLcl = loop->lpVarInit;
+ if (!genActualTypeIsInt(lvaGetDesc(initLcl)))
+ {
+ JITDUMP("> Init var V%02u not compatible with TYP_INT\n", initLcl);
+ return false;
+ }
+
+ LC_Condition geZero(GT_GE, LC_Expr(LC_Ident(initLcl, LC_Ident::Var)),
LC_Expr(LC_Ident(0, LC_Ident::Const)));
context->EnsureConditions(loopNum)->Push(geZero);
}
}
else if (loop->lpFlags & LPFLG_VAR_LIMIT)
{
- unsigned limitLcl = loop->lpVarLimit();
- ident = LC_Ident(limitLcl, LC_Ident::Var);
+ const unsigned limitLcl = loop->lpVarLimit();
+ if (!genActualTypeIsInt(lvaGetDesc(limitLcl)))
+ {
+ JITDUMP("> Limit var V%02u not compatible with TYP_INT\n", limitLcl);
+ return false;
+ }
+ ident = LC_Ident(limitLcl, LC_Ident::Var);
LC_Condition geZero(GT_GE, LC_Expr(ident), LC_Expr(LC_Ident(0, LC_Ident::Const)));
context->EnsureConditions(loopNum)->Push(geZero);
--- /dev/null
+using System;
+using System.Runtime.CompilerServices;
+
+class Runtime_57535
+{
+ static long z;
+
+ public static int Main()
+ {
+ z = 10;
+ int[] a = F();
+ long zz = z;
+ int result = 0;
+ for (int i = 0; i < (int) zz; i++)
+ {
+ result += a[i];
+ }
+ return result;
+ }
+
+ [MethodImpl(MethodImplOptions.NoInlining)]
+ static int[] F()
+ {
+ int[] result = new int[100];
+ result[3] = 100;
+ return result;
+ }
+}
--- /dev/null
+<Project Sdk="Microsoft.NET.Sdk">
+ <PropertyGroup>
+ <OutputType>Exe</OutputType>
+ </PropertyGroup>
+ <PropertyGroup>
+ <DebugType>None</DebugType>
+ <Optimize>True</Optimize>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="$(MSBuildProjectName).cs" />
+ </ItemGroup>
+</Project>
--- /dev/null
+using System;
+using System.Runtime.CompilerServices;
+
+class Runtime_57535_1
+{
+ static long z;
+
+ public static int Main()
+ {
+ z = 2;
+ int[] a = F();
+ long zz = z;
+ int result = 0;
+ for (int i = (int) zz; i < a.Length; i++)
+ {
+ result += a[i];
+ }
+ Bar(zz);
+ return result;
+ }
+
+ [MethodImpl(MethodImplOptions.NoInlining)]
+ static int[] F()
+ {
+ int[] result = new int[100];
+ result[3] = 100;
+ return result;
+ }
+
+ static void Bar(long z) {}
+}
--- /dev/null
+<Project Sdk="Microsoft.NET.Sdk">
+ <PropertyGroup>
+ <OutputType>Exe</OutputType>
+ </PropertyGroup>
+ <PropertyGroup>
+ <DebugType>None</DebugType>
+ <Optimize>True</Optimize>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="$(MSBuildProjectName).cs" />
+ </ItemGroup>
+</Project>