RyuJIT/ARM32: Fix helper kill mask and call target consuming
authorMikhail Skvortcov <m.skvortcov@partner.samsung.com>
Mon, 20 Feb 2017 14:56:54 +0000 (17:56 +0300)
committerMikhael Skvortsov <mikhael.skvortsov@gmail.com>
Thu, 23 Feb 2017 09:15:08 +0000 (12:15 +0300)
Commit migrated from https://github.com/dotnet/coreclr/commit/79817a4110f0fcf016f44432dc47fb56d7891b0c

src/coreclr/src/jit/codegenarm.cpp
src/coreclr/src/jit/lsra.cpp
src/coreclr/src/jit/target.h

index 580cad5..ca6ae01 100644 (file)
@@ -1404,6 +1404,8 @@ void CodeGen::genCallInstruction(GenTreePtr node)
         // For ARM a call target can not be a contained indirection
         assert(!target->isContainedIndir());
 
+        genConsumeReg(target);
+
         // We have already generated code for gtControlExpr evaluating it into a register.
         // We just need to emit "call reg" in this case.
         //
index ac76e29..2d317a7 100644 (file)
@@ -2782,9 +2782,6 @@ regMaskTP LinearScan::getKillSetForNode(GenTree* tree)
             if (compiler->codeGen->gcInfo.gcIsWriteBarrierAsgNode(tree))
             {
                 killMask = RBM_CALLEE_TRASH_NOGC;
-#if !NOGC_WRITE_BARRIERS && (defined(_TARGET_ARM_) || defined(_TARGET_AMD64_))
-                killMask |= (RBM_ARG_0 | RBM_ARG_1);
-#endif // !NOGC_WRITE_BARRIERS && (defined(_TARGET_ARM_) || defined(_TARGET_AMD64_))
             }
             break;
 
index cb2609f..474847e 100644 (file)
@@ -1246,7 +1246,11 @@ typedef unsigned short regPairNoSmall; // arm: need 12 bits
 
   #define RBM_CALLEE_SAVED        (RBM_INT_CALLEE_SAVED | RBM_FLT_CALLEE_SAVED)
   #define RBM_CALLEE_TRASH        (RBM_INT_CALLEE_TRASH | RBM_FLT_CALLEE_TRASH)
+#ifdef LEGACY_BACKEND
   #define RBM_CALLEE_TRASH_NOGC   (RBM_R2|RBM_R3|RBM_LR)
+#else
+  #define RBM_CALLEE_TRASH_NOGC   RBM_CALLEE_TRASH
+#endif
   #define REG_DEFAULT_HELPER_CALL_TARGET REG_R12
 
   #define RBM_ALLINT              (RBM_INT_CALLEE_SAVED | RBM_INT_CALLEE_TRASH)