// the GC pointer state before the callsite.
// We can't utilize the typical lazy killing of GC pointers
// at (or inside) the callsite.
- if (call->IsUnmanaged())
+ if (compiler->killGCRefs(call))
{
genDefineTempLabel(genCreateTempLabel());
}
// the GC pointer state before the callsite.
// We can't utilize the typical lazy killing of GC pointers
// at (or inside) the callsite.
- if (call->IsUnmanaged())
+ if (compiler->killGCRefs(call))
{
genDefineTempLabel(genCreateTempLabel());
}
/*****************************************************************************/
/*****************************************************************************/
+
+//------------------------------------------------------------------------
+// killGCRefs:
+// Given some tree node return does it need all GC refs to be spilled from
+// callee save registers.
+//
+// Arguments:
+// tree - the tree for which we ask about gc refs.
+//
+// Return Value:
+// true - tree kills GC refs on callee save registers
+// false - tree doesn't affect GC refs on callee save registers
+bool Compiler::killGCRefs(GenTreePtr tree)
+{
+ if (tree->IsCall())
+ {
+ GenTreeCall* call = tree->AsCall();
+ if (call->IsUnmanaged())
+ {
+ return true;
+ }
+
+ if (call->gtCallMethHnd == eeFindHelper(CORINFO_HELP_JIT_PINVOKE_BEGIN))
+ {
+ assert(opts.ShouldUsePInvokeHelpers());
+ return true;
+ }
+ }
+ return false;
+}
void fgMorphMultiregStructArgs(GenTreeCall* call);
GenTreePtr fgMorphMultiregStructArg(GenTreePtr arg, fgArgTabEntryPtr fgEntryPtr);
+ bool killGCRefs(GenTreePtr tree);
+
}; // end of class Compiler
// Inline methods of CompAllocator.
}
}
- if (killGCRefs(tree))
+ if (compiler->killGCRefs(tree))
{
RefPosition* pos = newRefPosition((Interval*)nullptr, currentLoc, RefTypeKillGCRefs, tree,
(allRegs(TYP_REF) & ~RBM_ARG_REGS));
return false;
}
-//------------------------------------------------------------------------
-// killGCRefs:
-// Given some tree node return does it need all GC refs to be spilled from
-// callee save registers.
-//
-// Arguments:
-// tree - the tree for which we ask about gc refs.
-//
-// Return Value:
-// true - tree kills GC refs on callee save registers
-// false - tree doesn't affect GC refs on callee save registers
-bool LinearScan::killGCRefs(GenTree* tree)
-{
- if (tree->IsCall())
- {
- if ((tree->gtFlags & GTF_CALL_UNMANAGED) != 0)
- {
- return true;
- }
-
- if (tree->AsCall()->gtCallMethHnd == compiler->eeFindHelper(CORINFO_HELP_JIT_PINVOKE_BEGIN))
- {
- assert(compiler->opts.ShouldUsePInvokeHelpers());
- return true;
- }
- }
- return false;
-}
-
//----------------------------------------------------------------------------
// defineNewInternalTemp: Defines a ref position for an internal temp.
//
// Given some tree node add refpositions for all the registers this node kills
bool buildKillPositionsForNode(GenTree* tree, LsraLocation currentLoc);
- bool killGCRefs(GenTree* tree);
-
regMaskTP allRegs(RegisterType rt);
regMaskTP allRegs(GenTree* tree);
regMaskTP allMultiRegCallNodeRegs(GenTreeCall* tree);