summaryrefslogtreecommitdiff
path: root/src/jit/codegenlegacy.cpp
diff options
context:
space:
mode:
authorHanjoung Lee <hanjoung.lee@samsung.com>2017-07-12 17:49:46 +0900
committerHanjoung Lee <hanjoung.lee@samsung.com>2017-07-12 17:49:46 +0900
commitb272c5e8f65b1551c80b66cae3e75de7f9e88a3f (patch)
tree52b4766fb7c501d66f5e089881a77eea8c641a97 /src/jit/codegenlegacy.cpp
parent359c135052b8db8e4a0045a42a9a3273336ed792 (diff)
downloadcoreclr-b272c5e8f65b1551c80b66cae3e75de7f9e88a3f.tar.gz
coreclr-b272c5e8f65b1551c80b66cae3e75de7f9e88a3f.tar.bz2
coreclr-b272c5e8f65b1551c80b66cae3e75de7f9e88a3f.zip
[LegacyJIT/ARM] Fix RegSet assert failure
Fix RegSet assert failure while codegen for CpBlk and InitBlk Fix #12686
Diffstat (limited to 'src/jit/codegenlegacy.cpp')
-rw-r--r--src/jit/codegenlegacy.cpp15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/jit/codegenlegacy.cpp b/src/jit/codegenlegacy.cpp
index b2a5a87a39..d6ce1d344b 100644
--- a/src/jit/codegenlegacy.cpp
+++ b/src/jit/codegenlegacy.cpp
@@ -9619,6 +9619,8 @@ void CodeGen::genCodeForBlkOp(GenTreePtr tree, regMaskTP destReg)
// What order should the Dest, Val/Src, and Size be calculated
+ regMaskTP regsToLock = RBM_ARG_0 | RBM_ARG_1 | RBM_ARG_2;
+
compiler->fgOrderBlockOps(tree, RBM_ARG_0, RBM_ARG_1, RBM_ARG_2, opsPtr, regsPtr); // OUT arguments
genComputeReg(opsPtr[0], regsPtr[0], RegSet::EXACT_REG, RegSet::KEEP_REG);
@@ -9627,6 +9629,11 @@ void CodeGen::genCodeForBlkOp(GenTreePtr tree, regMaskTP destReg)
{
genComputeReg(opsPtr[2], regsPtr[2], RegSet::EXACT_REG, RegSet::KEEP_REG);
}
+ else
+ {
+ regSet.rsLockReg(RBM_ARG_2);
+ regsToLock &= ~RBM_ARG_2;
+ }
genRecoverReg(opsPtr[0], regsPtr[0], RegSet::KEEP_REG);
genRecoverReg(opsPtr[1], regsPtr[1], RegSet::KEEP_REG);
@@ -9646,7 +9653,7 @@ void CodeGen::genCodeForBlkOp(GenTreePtr tree, regMaskTP destReg)
(sizeNode->gtRegNum == REG_ARG_2));
}
- regSet.rsLockUsedReg(RBM_ARG_0 | RBM_ARG_1 | RBM_ARG_2);
+ regSet.rsLockUsedReg(regsToLock);
genEmitHelperCall(isCopyBlk ? CORINFO_HELP_MEMCPY
/* GT_INITBLK */
@@ -9655,13 +9662,17 @@ void CodeGen::genCodeForBlkOp(GenTreePtr tree, regMaskTP destReg)
regTracker.rsTrackRegMaskTrash(RBM_CALLEE_TRASH);
- regSet.rsUnlockUsedReg(RBM_ARG_0 | RBM_ARG_1 | RBM_ARG_2);
+ regSet.rsUnlockUsedReg(regsToLock);
genReleaseReg(opsPtr[0]);
genReleaseReg(opsPtr[1]);
if (opsPtr[2] != nullptr)
{
genReleaseReg(opsPtr[2]);
}
+ else
+ {
+ regSet.rsUnlockReg(RBM_ARG_2);
+ }
}
if (isCopyBlk && dest->AsBlk()->IsVolatile())