Fix code generation for array length check in legacy JIT
authorHyeongseok Oh <hseok82.oh@samsung.com>
Thu, 23 Feb 2017 05:54:03 +0000 (14:54 +0900)
committerHyeongseok Oh <hseok82.oh@samsung.com>
Thu, 23 Feb 2017 07:52:17 +0000 (16:52 +0900)
check array index is in register and reload it if spilled

src/jit/codegenlegacy.cpp

index c616546..7fd2956 100644 (file)
@@ -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);