From 7e7e09d3b58bb7adff5dac3a51c5b6eee78c7c90 Mon Sep 17 00:00:00 2001 From: Hyeongseok Oh Date: Thu, 23 Feb 2017 14:54:03 +0900 Subject: [PATCH] Fix code generation for array length check in legacy JIT check array index is in register and reload it if spilled --- src/jit/codegenlegacy.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/jit/codegenlegacy.cpp b/src/jit/codegenlegacy.cpp index c616546..7fd2956 100644 --- a/src/jit/codegenlegacy.cpp +++ b/src/jit/codegenlegacy.cpp @@ -1897,10 +1897,22 @@ void CodeGen::genRangeCheck(GenTreePtr oper) { // If we need "arrRef" or "arrLen", and evaluating "index" displaced whichever of them we're using // from its register, get it back in a register. + regMaskTP indRegMask = RBM_ALLINT; + regMaskTP arrRegMask = RBM_ALLINT; + if (!(index->gtFlags & GTF_SPILLED)) + arrRegMask = ~genRegMask(index->gtRegNum); if (arrRef != NULL) - genRecoverReg(arrRef, ~genRegMask(index->gtRegNum), RegSet::KEEP_REG); + { + genRecoverReg(arrRef, arrRegMask, RegSet::KEEP_REG); + indRegMask &= ~genRegMask(arrRef->gtRegNum); + } else if (!arrLen->IsCnsIntOrI()) - genRecoverReg(arrLen, ~genRegMask(index->gtRegNum), RegSet::KEEP_REG); + { + genRecoverReg(arrLen, arrRegMask, RegSet::KEEP_REG); + indRegMask &= ~genRegMask(arrLen->gtRegNum); + } + if (index->gtFlags & GTF_SPILLED) + regSet.rsUnspillReg(index, indRegMask, RegSet::KEEP_REG); /* Make sure we have the values we expect */ noway_assert(index->gtFlags & GTF_REG_VAL); -- 2.7.4