diff --git a/src/coreclr/jit/lsraloongarch64.cpp b/src/coreclr/jit/lsraloongarch64.cpp index 0d5c629b7843c6..6e3c878836c051 100644 --- a/src/coreclr/jit/lsraloongarch64.cpp +++ b/src/coreclr/jit/lsraloongarch64.cpp @@ -723,7 +723,12 @@ int LinearScan::BuildCall(GenTreeCall* call) { // Fast tail call - make sure that call target is always computed in volatile registers // that will not be overridden by epilog sequence. - ctrlExprCandidates = (allRegs(TYP_INT) & (RBM_INT_CALLEE_TRASH & ~RBM_GSCOOKIE_TMP)); + ctrlExprCandidates = allRegs(TYP_INT) & RBM_INT_CALLEE_TRASH.GetIntRegSet(); + if (compiler->getNeedsGSSecurityCookie()) + { + ctrlExprCandidates &= + ~(genSingleTypeRegMask(REG_GSCOOKIE_TMP_0) | genSingleTypeRegMask(REG_GSCOOKIE_TMP_1)); + } assert(ctrlExprCandidates != RBM_NONE); } } @@ -734,7 +739,12 @@ int LinearScan::BuildCall(GenTreeCall* call) SingleTypeRegSet candidates = RBM_NONE; if (call->IsFastTailCall()) { - candidates = (allRegs(TYP_INT) & (RBM_INT_CALLEE_TRASH & ~RBM_GSCOOKIE_TMP).GetIntRegSet()); + candidates = allRegs(TYP_INT) & RBM_INT_CALLEE_TRASH.GetIntRegSet(); + if (compiler->getNeedsGSSecurityCookie()) + { + ctrlExprCandidates &= + ~(genSingleTypeRegMask(REG_GSCOOKIE_TMP_0) | genSingleTypeRegMask(REG_GSCOOKIE_TMP_1)); + } assert(candidates != RBM_NONE); } diff --git a/src/coreclr/jit/targetloongarch64.h b/src/coreclr/jit/targetloongarch64.h index 2382eaa767cc5c..dcc87944beb163 100644 --- a/src/coreclr/jit/targetloongarch64.h +++ b/src/coreclr/jit/targetloongarch64.h @@ -110,7 +110,6 @@ // Temporary registers used for the GS cookie check. #define REG_GSCOOKIE_TMP_0 REG_T0 #define REG_GSCOOKIE_TMP_1 REG_T1 - #define RBM_GSCOOKIE_TMP (RBM_T0|RBM_T1) // register to hold shift amount; no special register is required on LOONGARCH64. #define REG_SHIFT REG_NA