From a294de7e71b145bbb8ded6b031d21d05fe83a5c1 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Tue, 30 Jan 2024 09:26:40 -0800 Subject: [PATCH 1/3] Take into account the local involved in GT_SWITCH for resolution --- src/coreclr/jit/lsra.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/coreclr/jit/lsra.cpp b/src/coreclr/jit/lsra.cpp index ac2e25f95a11d6..479debea97cdad 100644 --- a/src/coreclr/jit/lsra.cpp +++ b/src/coreclr/jit/lsra.cpp @@ -8855,6 +8855,13 @@ void LinearScan::handleOutgoingCriticalEdges(BasicBlock* block) consumedRegs = switchTable->gtRsvdRegs; GenTree* op1 = switchTable->gtGetOp1(); GenTree* op2 = switchTable->gtGetOp2(); +#if defined(TARGET_ARM64) || defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64) || defined(TARGET_X86) + if (op1->IsLocal()) + { + GenTreeLclVarCommon* lcl = op1->AsLclVarCommon(); + terminatorNodeLclVarDsc = &compiler->lvaTable[lcl->GetLclNum()]; + } +#endif noway_assert(op1 != nullptr && op2 != nullptr); assert(op1->GetRegNum() != REG_NA && op2->GetRegNum() != REG_NA); // No floating point values, so no need to worry about the register type @@ -8898,11 +8905,13 @@ void LinearScan::handleOutgoingCriticalEdges(BasicBlock* block) GenTree* srcOp = op->gtGetOp1(); consumedRegs |= genRegMask(srcOp->GetRegNum()); } +#if defined(TARGET_ARM64) || defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64) || defined(TARGET_X86) else if (op->IsLocal()) { GenTreeLclVarCommon* lcl = op->AsLclVarCommon(); terminatorNodeLclVarDsc = &compiler->lvaTable[lcl->GetLclNum()]; } +#endif if (lastNode->OperIs(GT_JCMP, GT_JTEST) && !lastNode->gtGetOp2()->isContained()) { @@ -8997,7 +9006,7 @@ void LinearScan::handleOutgoingCriticalEdges(BasicBlock* block) sameToReg = REG_NA; } -#if defined(TARGET_ARM64) || defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64) +#if defined(TARGET_ARM64) || defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64) || defined(TARGET_X86) if ((terminatorNodeLclVarDsc != nullptr) && (terminatorNodeLclVarDsc->lvVarIndex == outResolutionSetVarIndex)) { From 689232227d8b9fed50af3b1858052a4e4ca7465f Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Tue, 30 Jan 2024 12:00:02 -0800 Subject: [PATCH 2/3] consolidate the logic, remove ifdef --- src/coreclr/jit/lsra.cpp | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/coreclr/jit/lsra.cpp b/src/coreclr/jit/lsra.cpp index 479debea97cdad..9730fde53e8b15 100644 --- a/src/coreclr/jit/lsra.cpp +++ b/src/coreclr/jit/lsra.cpp @@ -8855,13 +8855,6 @@ void LinearScan::handleOutgoingCriticalEdges(BasicBlock* block) consumedRegs = switchTable->gtRsvdRegs; GenTree* op1 = switchTable->gtGetOp1(); GenTree* op2 = switchTable->gtGetOp2(); -#if defined(TARGET_ARM64) || defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64) || defined(TARGET_X86) - if (op1->IsLocal()) - { - GenTreeLclVarCommon* lcl = op1->AsLclVarCommon(); - terminatorNodeLclVarDsc = &compiler->lvaTable[lcl->GetLclNum()]; - } -#endif noway_assert(op1 != nullptr && op2 != nullptr); assert(op1->GetRegNum() != REG_NA && op2->GetRegNum() != REG_NA); // No floating point values, so no need to worry about the register type @@ -8877,6 +8870,11 @@ void LinearScan::handleOutgoingCriticalEdges(BasicBlock* block) GenTree* srcOp1 = op1->gtGetOp1(); consumedRegs |= genRegMask(srcOp1->GetRegNum()); } + else if (op1->IsLocal()) + { + GenTreeLclVarCommon* lcl = op1->AsLclVarCommon(); + terminatorNodeLclVarDsc = &compiler->lvaTable[lcl->GetLclNum()]; + } } // Next, if this blocks ends with a JCMP/JTEST/JTRUE, we have to make sure: // 1. Not to copy into the register that JCMP/JTEST/JTRUE uses @@ -8905,13 +8903,11 @@ void LinearScan::handleOutgoingCriticalEdges(BasicBlock* block) GenTree* srcOp = op->gtGetOp1(); consumedRegs |= genRegMask(srcOp->GetRegNum()); } -#if defined(TARGET_ARM64) || defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64) || defined(TARGET_X86) else if (op->IsLocal()) { GenTreeLclVarCommon* lcl = op->AsLclVarCommon(); terminatorNodeLclVarDsc = &compiler->lvaTable[lcl->GetLclNum()]; } -#endif if (lastNode->OperIs(GT_JCMP, GT_JTEST) && !lastNode->gtGetOp2()->isContained()) { @@ -9006,7 +9002,6 @@ void LinearScan::handleOutgoingCriticalEdges(BasicBlock* block) sameToReg = REG_NA; } -#if defined(TARGET_ARM64) || defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64) || defined(TARGET_X86) if ((terminatorNodeLclVarDsc != nullptr) && (terminatorNodeLclVarDsc->lvVarIndex == outResolutionSetVarIndex)) { @@ -9017,7 +9012,6 @@ void LinearScan::handleOutgoingCriticalEdges(BasicBlock* block) { sameToReg = REG_NA; } -#endif // defined(TARGET_ARM64) || defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64) // If the var is live only at those blocks connected by a split edge and not live-in at some of the // target blocks, we will resolve it the same way as if it were in diffResolutionSet and resolution From f595c9dd2b9af77e0e76b997ac58413cdf0f7e84 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Tue, 6 Feb 2024 11:33:51 -0800 Subject: [PATCH 3/3] Add handling for op2 --- src/coreclr/jit/lsra.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/coreclr/jit/lsra.cpp b/src/coreclr/jit/lsra.cpp index 9730fde53e8b15..9caed0641e2c75 100644 --- a/src/coreclr/jit/lsra.cpp +++ b/src/coreclr/jit/lsra.cpp @@ -8875,6 +8875,16 @@ void LinearScan::handleOutgoingCriticalEdges(BasicBlock* block) GenTreeLclVarCommon* lcl = op1->AsLclVarCommon(); terminatorNodeLclVarDsc = &compiler->lvaTable[lcl->GetLclNum()]; } + if (op2->OperIs(GT_COPY)) + { + GenTree* srcOp2 = op2->gtGetOp1(); + consumedRegs |= genRegMask(srcOp2->GetRegNum()); + } + else if (op2->IsLocal()) + { + GenTreeLclVarCommon* lcl = op2->AsLclVarCommon(); + terminatorNodeLclVarDsc2 = &compiler->lvaTable[lcl->GetLclNum()]; + } } // Next, if this blocks ends with a JCMP/JTEST/JTRUE, we have to make sure: // 1. Not to copy into the register that JCMP/JTEST/JTRUE uses