Arm Containment Cleanup
authorCarol Eidt <carol.eidt@microsoft.com>
Thu, 24 Aug 2017 20:21:28 +0000 (13:21 -0700)
committerCarol Eidt <carol.eidt@microsoft.com>
Fri, 25 Aug 2017 15:47:43 +0000 (08:47 -0700)
- Fix a couple of issues with TreeNodeInfoInit for struct arguments
- Remove duplicate calls to LowerBlockStore from TreeNodeInfoInit for arm and arm64
- Eliminate duplicative isMultiReg method from GenTree and fix condition for OperIsMultiRegOp()

src/jit/gentree.cpp
src/jit/gentree.h
src/jit/lsra.cpp
src/jit/lsraarm.cpp
src/jit/lsraarm64.cpp
src/jit/lsraarmarch.cpp

index 5abbb2a413d3e25aac83db8173aa96e6e074e3e7..a8b565c19d1f319e6f9e3a756896ed1b43e8935d 100644 (file)
@@ -7030,17 +7030,12 @@ GenTreePtr Compiler::gtNewPutArgReg(var_types type, GenTreePtr arg, regNumber ar
     assert(arg != nullptr);
 
     GenTreePtr node = nullptr;
-#if !defined(LEGACY_BACKEND) && defined(_TARGET_ARM_)
+#if !defined(LEGACY_BACKEND) && defined(ARM_SOFTFP)
     // A PUTARG_REG could be a MultiRegOp on armel since we could move a double register to two int registers.
-    if (opts.compUseSoftFP)
-    {
-        node = new (this, GT_PUTARG_REG) GenTreeMultiRegOp(GT_PUTARG_REG, type, arg, nullptr);
-    }
-    else
+    node = new (this, GT_PUTARG_REG) GenTreeMultiRegOp(GT_PUTARG_REG, type, arg, nullptr);
+#else
+    node            = gtNewOperNode(GT_PUTARG_REG, type, arg);
 #endif
-    {
-        node = gtNewOperNode(GT_PUTARG_REG, type, arg);
-    }
     node->gtRegNum = argReg;
 
     return node;
@@ -9975,7 +9970,7 @@ void Compiler::gtDispRegVal(GenTree* tree)
 #endif
 
 #if !defined(LEGACY_BACKEND) && defined(_TARGET_ARM_)
-    if (tree->IsMultiReg() && tree->AsMultiRegOp()->gtOtherReg != REG_NA)
+    if (tree->OperIsMultiRegOp() && tree->AsMultiRegOp()->gtOtherReg != REG_NA)
     {
         printf(",%s", compRegVarName(tree->AsMultiRegOp()->gtOtherReg));
     }
index f9baed23f51d5f71e8c79448039c5eccd73fe909..a5d0337f6df0a3be116690b889e66d2932dc6576 100644 (file)
@@ -1333,7 +1333,11 @@ public:
     bool OperIsMultiRegOp() const
     {
 #if !defined(LEGACY_BACKEND) && defined(_TARGET_ARM_)
-        if (gtOper == GT_MUL_LONG || gtOper == GT_PUTARG_REG || gtOper == GT_COPY)
+        if (gtOper == GT_MUL_LONG ||
+#ifdef ARM_SOFTFP
+            gtOper == GT_PUTARG_REG ||
+#endif
+            gtOper == GT_COPY)
         {
             return true;
         }
@@ -1779,9 +1783,6 @@ public:
     // Returns true if it is a GT_COPY or GT_RELOAD of a multi-reg call node
     inline bool IsCopyOrReloadOfMultiRegCall() const;
 
-    // Returns true if it is a MultiRegOp
-    inline bool IsMultiReg() const;
-
     bool OperMayThrow();
 
     unsigned GetScaleIndexMul();
@@ -6001,27 +6002,6 @@ inline bool GenTree::IsCopyOrReloadOfMultiRegCall() const
     return false;
 }
 
-//-----------------------------------------------------------------------------------
-// IsMultiReg: whether this is a MultiReg node (i.e. GT_MUL_LONG or GT_PUTARG_REG)
-//
-// Arguments:
-//     None
-//
-// Return Value:
-//     Returns true if this GenTree is a MultiReg node
-inline bool GenTree::IsMultiReg() const
-{
-#if !defined(LEGACY_BACKEND) && defined(_TARGET_ARM_)
-#ifdef ARM_SOFTFP
-    return (gtOper == GT_MUL_LONG) || (gtOper == GT_PUTARG_REG);
-#else  // !ARM_SOFTFP
-    return gtOper == GT_MUL_LONG;
-#endif // !ARM_SOFTFP
-#else  // ! _TARGET_ARM_
-    return false;
-#endif // ! _TARGET_ARM_
-}
-
 inline bool GenTree::IsCnsIntOrI() const
 {
     return (gtOper == GT_CNS_INT);
index 67e365893781dfadbdb128dfc0a7db0abfc44fec..afb63d023830150fb3db31f1401093a35ee21f7f 100644 (file)
@@ -3517,6 +3517,15 @@ static int ComputeOperandDstCount(GenTree* operand)
         // pointers to argument setup stores.
         return 0;
     }
+#ifdef _TARGET_ARMARCH_
+    else if (operand->OperIsPutArgStk())
+    {
+        // A PUTARG_STK argument is an operand of a call, but is neither contained, nor does it produce
+        // a result.
+        assert(!operand->isContained());
+        return 0;
+    }
+#endif // _TARGET_ARMARCH_
     else
     {
         // If a field list or non-void-typed operand is not an unused value and does not have source registers,
index 105797ae3b993d64427eed1ed873bdec65aa3ae9..3bbcce9fa059d697e42de82eb6956ddacfb03012 100644 (file)
@@ -639,7 +639,6 @@ void Lowering::TreeNodeInfoInit(GenTree* tree)
         case GT_STORE_BLK:
         case GT_STORE_OBJ:
         case GT_STORE_DYN_BLK:
-            LowerBlockStore(tree->AsBlk());
             TreeNodeInfoInitBlockStore(tree->AsBlk());
             break;
 
index d9002b376b98a866b6aa1c2128db4a58a1a4d652..35972db97ae0530dca55a4631d927c0b7d63495e 100644 (file)
@@ -421,7 +421,6 @@ void Lowering::TreeNodeInfoInit(GenTree* tree)
         case GT_STORE_BLK:
         case GT_STORE_OBJ:
         case GT_STORE_DYN_BLK:
-            LowerBlockStore(tree->AsBlk());
             TreeNodeInfoInitBlockStore(tree->AsBlk());
             break;
 
index 69bb4defa6d565c4db083808723cf025f2dd4f75..0f60630066191b345b305f7063250c0b88ddaba5 100644 (file)
@@ -559,20 +559,18 @@ void Lowering::TreeNodeInfoInitCall(GenTreeCall* call)
         // Skip arguments that have been moved to the Late Arg list
         if (!(args->gtFlags & GTF_LATE_ARG))
         {
+#ifdef DEBUG
+            fgArgTabEntryPtr curArgTabEntry = compiler->gtArgEntryByNode(call, arg);
+            assert(curArgTabEntry);
+#endif
             if (arg->gtOper == GT_PUTARG_STK)
             {
-                fgArgTabEntryPtr curArgTabEntry = compiler->gtArgEntryByNode(call, arg);
-                assert(curArgTabEntry);
-
-                assert(curArgTabEntry->regNum == REG_STK);
+                INDEBUG(assert(curArgTabEntry->regNum == REG_STK));
             }
 #ifdef _TARGET_ARM_
             else if (arg->OperGet() == GT_PUTARG_SPLIT)
             {
-#ifdef DEBUG
-                fgArgTabEntryPtr curArgTabEntry = compiler->gtArgEntryByNode(call, arg);
-                assert(arg->AsPutArgSplit()->gtNumRegs == curArgTabEntry->numRegs);
-#endif
+                INDEBUG(assert(arg->AsPutArgSplit()->gtNumRegs == curArgTabEntry->numRegs));
                 info->srcCount += arg->gtLsraInfo.dstCount;
             }
 #endif