summaryrefslogtreecommitdiff
path: root/src/jit/codegenlegacy.cpp
diff options
context:
space:
mode:
authorBruce Forstall <brucefo@microsoft.com>2017-07-12 08:33:50 -0700
committerGitHub <noreply@github.com>2017-07-12 08:33:50 -0700
commita9d26213dab7b296fb6cabcac35215a996172b3f (patch)
tree120eb8ed722f61be24e57211162101295904ba97 /src/jit/codegenlegacy.cpp
parent133b26b852aaf85ad74092e41657b70786488d17 (diff)
parentb272c5e8f65b1551c80b66cae3e75de7f9e88a3f (diff)
downloadcoreclr-a9d26213dab7b296fb6cabcac35215a996172b3f.tar.gz
coreclr-a9d26213dab7b296fb6cabcac35215a996172b3f.tar.bz2
coreclr-a9d26213dab7b296fb6cabcac35215a996172b3f.zip
Merge pull request #12762 from wateret/fix-legacy-12686
[LegacyJIT/ARM] Fix RegSet assert failure
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 5a8c282ad5..6b0441eb02 100644
--- a/src/jit/codegenlegacy.cpp
+++ b/src/jit/codegenlegacy.cpp
@@ -9621,6 +9621,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);
@@ -9629,6 +9631,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);
@@ -9648,7 +9655,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 */
@@ -9657,13 +9664,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())