From 13d9b9f08cebb57567838b1ddf1c4f4477961e50 Mon Sep 17 00:00:00 2001 From: Carol Eidt Date: Mon, 21 Nov 2016 18:58:40 -0800 Subject: [PATCH] Set the size of SIMD this pointer When setting the SIMD type of a "this" pointer, we need to capture the size of the SIMD type. This was previously being set in a method in simd.cpp, but when the SIMD type recognition was moved earlier in the JIT, it was omitted. This caused an assert in the case where a fixed-size SIMD type is handled by `fgMorphCombineSIMDFieldAssignments()`. Fixes bug 288222 --- src/jit/lclvars.cpp | 5 +- .../JitBlue/DevDiv_288222/DevDiv_288222.cs | 50 +++++++++++++++++++ .../DevDiv_288222/DevDiv_288222.csproj | 46 +++++++++++++++++ 3 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 tests/src/JIT/Regression/JitBlue/DevDiv_288222/DevDiv_288222.cs create mode 100644 tests/src/JIT/Regression/JitBlue/DevDiv_288222/DevDiv_288222.csproj diff --git a/src/jit/lclvars.cpp b/src/jit/lclvars.cpp index 299040da81..3a1281bf47 100644 --- a/src/jit/lclvars.cpp +++ b/src/jit/lclvars.cpp @@ -385,8 +385,9 @@ void Compiler::lvaInitThisPtr(InitVarDscInfo* varDscInfo) if (simdBaseType != TYP_UNKNOWN) { assert(varTypeIsSIMD(type)); - varDsc->lvSIMDType = true; - varDsc->lvBaseType = simdBaseType; + varDsc->lvSIMDType = true; + varDsc->lvBaseType = simdBaseType; + varDsc->lvExactSize = genTypeSize(type); } } #endif // FEATURE_SIMD diff --git a/tests/src/JIT/Regression/JitBlue/DevDiv_288222/DevDiv_288222.cs b/tests/src/JIT/Regression/JitBlue/DevDiv_288222/DevDiv_288222.cs new file mode 100644 index 0000000000..e24c7977ba --- /dev/null +++ b/tests/src/JIT/Regression/JitBlue/DevDiv_288222/DevDiv_288222.cs @@ -0,0 +1,50 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + + +using System; +using System.Runtime.CompilerServices; +using System.Numerics; + +// This test is a repro case for DevDiv VSO bug 288222. +// The failure mode is that the size was not being set for a "this" pointer +// with SIMD type. + +internal class Program +{ + // Declare a delegate type for calling the Vector2.CopyTo method. + public delegate void CopyToDelegate(float[] array, int start); + + [MethodImpl(MethodImplOptions.NoInlining)] + public static void MyCopyTo(CopyToDelegate doCopy, float[] array, int start) + { + doCopy(array, start); + } + + private static int Main(string[] args) + { + try + { + float x = 1.0F; + float y = 2.0F; + Vector2 v = new Vector2(x, y); + float[] array = new float[4]; + MyCopyTo(new CopyToDelegate(v.CopyTo), array, 2); + + if ((array[2] != x) || (array[3] != y)) + { + Console.WriteLine("Failed with wrong values"); + return -1; + } + } + catch (Exception e) + { + Console.WriteLine("Failed with exception: " + e.Message); + return -1; + } + + Console.WriteLine("Pass"); + return 100; + } +} diff --git a/tests/src/JIT/Regression/JitBlue/DevDiv_288222/DevDiv_288222.csproj b/tests/src/JIT/Regression/JitBlue/DevDiv_288222/DevDiv_288222.csproj new file mode 100644 index 0000000000..0aa2d11c7b --- /dev/null +++ b/tests/src/JIT/Regression/JitBlue/DevDiv_288222/DevDiv_288222.csproj @@ -0,0 +1,46 @@ + + + + + Debug + AnyCPU + $(MSBuildProjectName) + 2.0 + {95DFC527-4DC1-495E-97D7-E94EE1F7140D} + Exe + Properties + 512 + {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + $(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages + ..\..\ + + 7a9bfb7d + + + + + + + + + False + + + + + True + + + + + + + + + $(JitPackagesConfigFileDirectory)threading+thread\project.json + $(JitPackagesConfigFileDirectory)threading+thread\project.lock.json + + + + + -- 2.34.1