From 7caaa18365cef4889fa80fe740ad44c3428a7339 Mon Sep 17 00:00:00 2001 From: qiaopengcheng Date: Tue, 16 May 2023 16:01:47 +0800 Subject: [PATCH 1/3] Fix the regs conflicts within the `addResolution` for LoongArch64/RISC-V. --- src/coreclr/jit/lsra.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/coreclr/jit/lsra.cpp b/src/coreclr/jit/lsra.cpp index 35a443f2a32a3..b86b707121906 100644 --- a/src/coreclr/jit/lsra.cpp +++ b/src/coreclr/jit/lsra.cpp @@ -8155,6 +8155,8 @@ void LinearScan::handleOutgoingCriticalEdges(BasicBlock* block) if (lastNode->OperIs(GT_JTRUE, GT_JCMP, GT_JTEST)) { GenTree* op = lastNode->gtGetOp1(); + +Consume_Op2: consumedRegs |= genRegMask(op->GetRegNum()); if (op->OperIs(GT_COPY)) @@ -8162,16 +8164,20 @@ void LinearScan::handleOutgoingCriticalEdges(BasicBlock* block) GenTree* srcOp = op->gtGetOp1(); consumedRegs |= genRegMask(srcOp->GetRegNum()); } - - if (op->IsLocal()) + else if (op->IsLocal()) { GenTreeLclVarCommon* lcl = op->AsLclVarCommon(); terminatorNodeLclVarDsc = &compiler->lvaTable[lcl->GetLclNum()]; } + if (!lastNode->gtGetOp2()->isContainedIntOrIImmed() && (op != lastNode->gtGetOp2())) + { + op = lastNode->gtGetOp2(); + goto Consume_Op2; + } + #if !defined(TARGET_LOONGARCH64) && !defined(TARGET_RISCV64) - // TODO-LOONGARCH64: Take into account that on LA64, the second - // operand of a JCMP can be in a register too. + // For LoongArch64/RISC-V, the second operand of a JCMP can be in a register too. assert(!lastNode->OperIs(GT_JCMP, GT_JTEST) || lastNode->gtGetOp2()->isContained()); #endif } From 4dcd720d4f26d96709cb6e72b4a707d4ba31e881 Mon Sep 17 00:00:00 2001 From: qiaopengcheng Date: Tue, 16 May 2023 16:17:29 +0800 Subject: [PATCH 2/3] amend the code for CR. --- src/coreclr/jit/lsra.cpp | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/coreclr/jit/lsra.cpp b/src/coreclr/jit/lsra.cpp index b86b707121906..82ba8480047e5 100644 --- a/src/coreclr/jit/lsra.cpp +++ b/src/coreclr/jit/lsra.cpp @@ -8155,8 +8155,6 @@ void LinearScan::handleOutgoingCriticalEdges(BasicBlock* block) if (lastNode->OperIs(GT_JTRUE, GT_JCMP, GT_JTEST)) { GenTree* op = lastNode->gtGetOp1(); - -Consume_Op2: consumedRegs |= genRegMask(op->GetRegNum()); if (op->OperIs(GT_COPY)) @@ -8170,16 +8168,22 @@ void LinearScan::handleOutgoingCriticalEdges(BasicBlock* block) terminatorNodeLclVarDsc = &compiler->lvaTable[lcl->GetLclNum()]; } - if (!lastNode->gtGetOp2()->isContainedIntOrIImmed() && (op != lastNode->gtGetOp2())) + if (lastNode->OperIs(GT_JCMP, GT_JTEST) && !lastNode->gtGetOp2()->isContained()) { op = lastNode->gtGetOp2(); - goto Consume_Op2; - } + consumedRegs |= genRegMask(op->GetRegNum()); -#if !defined(TARGET_LOONGARCH64) && !defined(TARGET_RISCV64) - // For LoongArch64/RISC-V, the second operand of a JCMP can be in a register too. - assert(!lastNode->OperIs(GT_JCMP, GT_JTEST) || lastNode->gtGetOp2()->isContained()); -#endif + if (op->OperIs(GT_COPY)) + { + GenTree* srcOp = op->gtGetOp1(); + consumedRegs |= genRegMask(srcOp->GetRegNum()); + } + else if (op->IsLocal()) + { + GenTreeLclVarCommon* lcl = op->AsLclVarCommon(); + terminatorNodeLclVarDsc = &compiler->lvaTable[lcl->GetLclNum()]; + } + } } } From c14b3fc0557436b24688ad26eb7986000e3b8a2a Mon Sep 17 00:00:00 2001 From: qiaopengcheng Date: Tue, 16 May 2023 16:43:45 +0800 Subject: [PATCH 3/3] add terminatorNodeLclVarDsc2 for the second op2. --- src/coreclr/jit/lsra.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/coreclr/jit/lsra.cpp b/src/coreclr/jit/lsra.cpp index 82ba8480047e5..5fb8b13cbadec 100644 --- a/src/coreclr/jit/lsra.cpp +++ b/src/coreclr/jit/lsra.cpp @@ -8102,7 +8102,8 @@ void LinearScan::handleOutgoingCriticalEdges(BasicBlock* block) } } - LclVarDsc* terminatorNodeLclVarDsc = nullptr; + LclVarDsc* terminatorNodeLclVarDsc = nullptr; + LclVarDsc* terminatorNodeLclVarDsc2 = nullptr; // Next, if this blocks ends with a switch table, or for Arm64, ends with JCMP/JTEST instruction, // make sure to not copy into the registers that are consumed at the end of this block. // @@ -8181,7 +8182,7 @@ void LinearScan::handleOutgoingCriticalEdges(BasicBlock* block) else if (op->IsLocal()) { GenTreeLclVarCommon* lcl = op->AsLclVarCommon(); - terminatorNodeLclVarDsc = &compiler->lvaTable[lcl->GetLclNum()]; + terminatorNodeLclVarDsc2 = &compiler->lvaTable[lcl->GetLclNum()]; } } } @@ -8267,6 +8268,11 @@ void LinearScan::handleOutgoingCriticalEdges(BasicBlock* block) { sameToReg = REG_NA; } + else if ((terminatorNodeLclVarDsc2 != nullptr) && + (terminatorNodeLclVarDsc2->lvVarIndex == outResolutionSetVarIndex)) + { + 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