From 0498a6664fb3aa74fba26ef27f261d2f1a0a58c5 Mon Sep 17 00:00:00 2001 From: Carol Eidt Date: Mon, 18 Jun 2018 17:11:56 -0700 Subject: [PATCH] genPutArgStk needs to check for FIELD_LIST first (dotnet/coreclr#18499) When a struct is passed on the stack using `FIELD_LIST`, the type of the `FIELD_LIST` is the type of its first field. If that type was a struct type (i.e. a SIMD type), `genPutArgStk` would assume that it was the non-`FIELD_LIST` case. Fix dotnet/coreclr#18497 Commit migrated from https://github.com/dotnet/coreclr/commit/e9946c0de3bcab0d09ce5f10a039b37d6497d4cb --- src/coreclr/src/jit/codegenxarch.cpp | 12 ++--- .../JitBlue/GitHub_18497/GitHub_18497.cs | 53 ++++++++++++++++++++++ .../JitBlue/GitHub_18497/GitHub_18497.csproj | 35 ++++++++++++++ 3 files changed, 94 insertions(+), 6 deletions(-) create mode 100644 src/coreclr/tests/src/JIT/Regression/JitBlue/GitHub_18497/GitHub_18497.cs create mode 100644 src/coreclr/tests/src/JIT/Regression/JitBlue/GitHub_18497/GitHub_18497.csproj diff --git a/src/coreclr/src/jit/codegenxarch.cpp b/src/coreclr/src/jit/codegenxarch.cpp index a6fd7cc..d3f021c 100644 --- a/src/coreclr/src/jit/codegenxarch.cpp +++ b/src/coreclr/src/jit/codegenxarch.cpp @@ -7903,7 +7903,12 @@ void CodeGen::genPutArgStk(GenTreePutArgStk* putArgStk) #ifdef UNIX_AMD64_ABI - if (varTypeIsStruct(targetType)) + if (data->OperIs(GT_FIELD_LIST)) + { + genPutArgStkFieldList(putArgStk, baseVarNum); + return; + } + else if (varTypeIsStruct(targetType)) { m_stkArgVarNum = baseVarNum; m_stkArgOffset = putArgStk->getArgOffset(); @@ -7911,11 +7916,6 @@ void CodeGen::genPutArgStk(GenTreePutArgStk* putArgStk) m_stkArgVarNum = BAD_VAR_NUM; return; } - else if (data->OperIs(GT_FIELD_LIST)) - { - genPutArgStkFieldList(putArgStk, baseVarNum); - return; - } #endif // UNIX_AMD64_ABI noway_assert(targetType != TYP_STRUCT); diff --git a/src/coreclr/tests/src/JIT/Regression/JitBlue/GitHub_18497/GitHub_18497.cs b/src/coreclr/tests/src/JIT/Regression/JitBlue/GitHub_18497/GitHub_18497.cs new file mode 100644 index 0000000..c435958 --- /dev/null +++ b/src/coreclr/tests/src/JIT/Regression/JitBlue/GitHub_18497/GitHub_18497.cs @@ -0,0 +1,53 @@ +// 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.Numerics; +using System.Runtime.CompilerServices; + +struct S +{ + public Vector v1; + public Vector v2; +}; + +static class GitHub_18497 +{ + static S sStatic; + + [MethodImpl(MethodImplOptions.NoInlining)] + static Vector Sum(S s) + { + return s.v1 + s.v2; + } + + [MethodImpl(MethodImplOptions.NoInlining)] + static Vector Test() + { + S sLocal = sStatic; + return Sum(sLocal); + } + + static int Main() + { + bool pass = true; + sStatic.v1 = new Vector(0.0F); + sStatic.v2 = new Vector(1.0F); + Vector v = Test(); + + for (int i = 0; i < Vector.Count; i++) + { + if (Math.Abs((double)(v[i] - 1.0F)) > (double)Single.Epsilon) + { + pass = false; + } + } + if (!pass) + { + Console.WriteLine("Failed: v = " + v.ToString()); + return -1; + } + return 100; + } +} diff --git a/src/coreclr/tests/src/JIT/Regression/JitBlue/GitHub_18497/GitHub_18497.csproj b/src/coreclr/tests/src/JIT/Regression/JitBlue/GitHub_18497/GitHub_18497.csproj new file mode 100644 index 0000000..0b9fa76 --- /dev/null +++ b/src/coreclr/tests/src/JIT/Regression/JitBlue/GitHub_18497/GitHub_18497.csproj @@ -0,0 +1,35 @@ + + + + + Debug + AnyCPU + $(MSBuildProjectName) + 2.0 + {95DFC527-4DC1-495E-97D7-E94EE1F7140D} + Exe + {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + ..\..\ + + + + + + + False + + + + + True + True + + + + + + + + + + -- 2.7.4