diff options
author | Bruce Forstall <brucefo@microsoft.com> | 2017-07-12 08:33:50 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-07-12 08:33:50 -0700 |
commit | a9d26213dab7b296fb6cabcac35215a996172b3f (patch) | |
tree | 120eb8ed722f61be24e57211162101295904ba97 /src/jit/codegenlegacy.cpp | |
parent | 133b26b852aaf85ad74092e41657b70786488d17 (diff) | |
parent | b272c5e8f65b1551c80b66cae3e75de7f9e88a3f (diff) | |
download | coreclr-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.cpp | 15 |
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()) |