Do not get the GC layout for small structs in legacy backend.
authorPat Gavlin <pagavlin@microsoft.com>
Wed, 26 Jul 2017 01:15:40 +0000 (18:15 -0700)
committerPat Gavlin <pagavlin@microsoft.com>
Wed, 26 Jul 2017 01:15:40 +0000 (18:15 -0700)
Such structs are too small to contain any GC pointers. Synthesize a GC
layout with a single slot of `TYPE_GC_NONE`.

Fixes VSO 469600.

src/jit/codegenlegacy.cpp

index e82faf6..acb9c93 100644 (file)
@@ -17693,7 +17693,16 @@ void CodeGen::SetupLateArgs(GenTreeCall* call)
 
                     getEmitter()->emitIns_R_S(INS_lea, EA_PTRSIZE, regSrc, varNum, 0);
                     regTracker.rsTrackRegTrash(regSrc);
-                    gcLayout = compiler->lvaGetGcLayout(varNum);
+
+                    if (varDsc->lvExactSize >= TARGET_POINTER_SIZE)
+                    {
+                        gcLayout = compiler->lvaGetGcLayout(varNum);
+                    }
+                    else
+                    {
+                        gcLayout = new (compiler, CMK_Codegen) BYTE[1];
+                        gcLayout[0] = TYPE_GC_NONE;
+                    }
                 }
             }
             else if (arg->gtOper == GT_MKREFANY)