Skip to content

Commit 2a04cff

Browse files
authored
JIT: fix profiler leave hook kill set for void returns on arm (#117201)
For arm void return methods, the profiler leave hook codegen kills R0. Model this so we don't inadvertently report R0 as gc-live. Fixes #117149.
1 parent 6b259a2 commit 2a04cff

File tree

7 files changed

+28
-13
lines changed

7 files changed

+28
-13
lines changed

src/coreclr/jit/lsra.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1066,7 +1066,7 @@ class LinearScan : public LinearScanInterface
10661066
regMaskTP getKillSetForCall(GenTreeCall* call);
10671067
regMaskTP getKillSetForModDiv(GenTreeOp* tree);
10681068
regMaskTP getKillSetForBlockStore(GenTreeBlk* blkNode);
1069-
regMaskTP getKillSetForReturn();
1069+
regMaskTP getKillSetForReturn(GenTree* returnNode);
10701070
regMaskTP getKillSetForProfilerHook();
10711071
#ifdef FEATURE_HW_INTRINSICS
10721072
regMaskTP getKillSetForHWIntrinsic(GenTreeHWIntrinsic* node);

src/coreclr/jit/lsraarm.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -468,7 +468,7 @@ int LinearScan::BuildNode(GenTree* tree)
468468

469469
case GT_RETURN:
470470
srcCount = BuildReturn(tree);
471-
killMask = getKillSetForReturn();
471+
killMask = getKillSetForReturn(tree);
472472
BuildKills(tree, killMask);
473473
break;
474474

src/coreclr/jit/lsraarm64.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -780,7 +780,7 @@ int LinearScan::BuildNode(GenTree* tree)
780780

781781
case GT_RETURN:
782782
srcCount = BuildReturn(tree);
783-
killMask = getKillSetForReturn();
783+
killMask = getKillSetForReturn(tree);
784784
BuildKills(tree, killMask);
785785
break;
786786

@@ -789,7 +789,7 @@ int LinearScan::BuildNode(GenTree* tree)
789789
BuildUse(tree->gtGetOp1(), RBM_SWIFT_ERROR.GetIntRegSet());
790790
// Plus one for error register
791791
srcCount = BuildReturn(tree) + 1;
792-
killMask = getKillSetForReturn();
792+
killMask = getKillSetForReturn(tree);
793793
BuildKills(tree, killMask);
794794
break;
795795
#endif // SWIFT_SUPPORT

src/coreclr/jit/lsrabuild.cpp

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// Licensed to the .NET Foundation under one or more agreements.
2+
// Licensed to the .NET Foundation under one or more agreements.
23
// The .NET Foundation licenses this file to you under the MIT license.
34

45
/*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
@@ -1003,14 +1004,28 @@ regMaskTP LinearScan::getKillSetForHWIntrinsic(GenTreeHWIntrinsic* node)
10031004
// getKillSetForReturn: Determine the liveness kill set for a return node.
10041005
//
10051006
// Arguments:
1006-
// NONE (this kill set is independent of the details of the specific return.)
1007+
// returnNode - the return node
10071008
//
10081009
// Return Value: a register mask of the registers killed
10091010
//
1010-
regMaskTP LinearScan::getKillSetForReturn()
1011+
regMaskTP LinearScan::getKillSetForReturn(GenTree* returnNode)
10111012
{
1012-
return compiler->compIsProfilerHookNeeded() ? compiler->compHelperCallKillSet(CORINFO_HELP_PROF_FCN_LEAVE)
1013-
: RBM_NONE;
1013+
regMaskTP killSet = RBM_NONE;
1014+
1015+
if (compiler->compIsProfilerHookNeeded())
1016+
{
1017+
killSet = compiler->compHelperCallKillSet(CORINFO_HELP_PROF_FCN_LEAVE);
1018+
1019+
#if defined(TARGET_ARM)
1020+
// For arm methods with no return value R0 is also trashed.
1021+
if (returnNode->TypeIs(TYP_VOID))
1022+
{
1023+
killSet |= RBM_R0;
1024+
}
1025+
#endif
1026+
}
1027+
1028+
return killSet;
10141029
}
10151030

10161031
//------------------------------------------------------------------------
@@ -1091,7 +1106,7 @@ regMaskTP LinearScan::getKillSetForNode(GenTree* tree)
10911106
// more details.
10921107
case GT_RETURN:
10931108
case GT_SWIFT_ERROR_RET:
1094-
killMask = getKillSetForReturn();
1109+
killMask = getKillSetForReturn(tree);
10951110
break;
10961111

10971112
case GT_PROF_HOOK:

src/coreclr/jit/lsraloongarch64.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ int LinearScan::BuildNode(GenTree* tree)
169169

170170
case GT_RETURN:
171171
srcCount = BuildReturn(tree);
172-
killMask = getKillSetForReturn();
172+
killMask = getKillSetForReturn(tree);
173173
BuildKills(tree, killMask);
174174
break;
175175

src/coreclr/jit/lsrariscv64.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ int LinearScan::BuildNode(GenTree* tree)
173173

174174
case GT_RETURN:
175175
srcCount = BuildReturn(tree);
176-
killMask = getKillSetForReturn();
176+
killMask = getKillSetForReturn(tree);
177177
BuildKills(tree, killMask);
178178
break;
179179

src/coreclr/jit/lsraxarch.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ int LinearScan::BuildNode(GenTree* tree)
194194

195195
case GT_RETURN:
196196
srcCount = BuildReturn(tree);
197-
killMask = getKillSetForReturn();
197+
killMask = getKillSetForReturn(tree);
198198
BuildKills(tree, killMask);
199199
break;
200200

@@ -203,7 +203,7 @@ int LinearScan::BuildNode(GenTree* tree)
203203
BuildUse(tree->gtGetOp1(), RBM_SWIFT_ERROR.GetIntRegSet());
204204
// Plus one for error register
205205
srcCount = BuildReturn(tree) + 1;
206-
killMask = getKillSetForReturn();
206+
killMask = getKillSetForReturn(tree);
207207
BuildKills(tree, killMask);
208208
break;
209209
#endif // SWIFT_SUPPORT

0 commit comments

Comments
 (0)