From 03cf169da9092bb07041caf0375440b9defc7435 Mon Sep 17 00:00:00 2001 From: Carol Eidt Date: Tue, 19 Jun 2018 10:06:48 -0700 Subject: [PATCH] Fix struct promotion check for SIMD field A struct can have `lvIsRegArg` true but have multiple SIMD fields if it is passed by reference. --- src/jit/lclvars.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jit/lclvars.cpp b/src/jit/lclvars.cpp index e0e8f747a24c..b36fcad94164 100644 --- a/src/jit/lclvars.cpp +++ b/src/jit/lclvars.cpp @@ -2011,7 +2011,7 @@ void Compiler::lvaPromoteStructVar(unsigned lclNum, lvaStructPromotionInfo* Stru fieldVarDsc->lvArgReg = varDsc->lvArgReg; fieldVarDsc->setPrefReg(varDsc->lvArgReg, this); // Set the preferred register #if FEATURE_MULTIREG_ARGS && defined(FEATURE_SIMD) - if (varTypeIsSIMD(fieldVarDsc)) + if (varTypeIsSIMD(fieldVarDsc) && !lvaIsImplicitByRefLocal(lclNum)) { // This field is a SIMD type, and will be considered to be passed in multiple registers // if the parent struct was. Note that this code relies on the fact that if there is