Fix regeression with Containment
authorHyeongseok Oh <hseok82.oh@samsung.com>
Thu, 24 Aug 2017 01:27:18 +0000 (10:27 +0900)
committerHyeongseok Oh <hseok82.oh@samsung.com>
Thu, 24 Aug 2017 10:41:30 +0000 (19:41 +0900)
- SetContained for GT_FIELD_LIST
- OperIsMultiRegOp return true for armel only
- Simplify lowering long argument and fix type

src/jit/gentree.h
src/jit/lower.cpp

index da3df1e..f1d3ff4 100644 (file)
@@ -1332,7 +1332,7 @@ public:
 
     bool OperIsMultiRegOp() const
     {
-#if !defined(LEGACY_BACKEND) && defined(_TARGET_ARM_)
+#if !defined(LEGACY_BACKEND) && defined(_TARGET_ARM_) && defined(ARM_SOFTFP)
         if (gtOper == GT_MUL_LONG || gtOper == GT_PUTARG_REG || gtOper == GT_COPY)
         {
             return true;
index 3e3f5a4..5351e44 100644 (file)
@@ -860,7 +860,7 @@ GenTreePtr Lowering::NewPutArg(GenTreeCall* call, GenTreePtr arg, fgArgTabEntryP
 #endif // !FEATURE_UNIX_AMD64_STRUCT_PASSING
 
 #ifdef _TARGET_ARMARCH_
-    if (varTypeIsStruct(type))
+    if (varTypeIsStruct(type) || arg->OperGet() == GT_FIELD_LIST)
     {
         arg->SetContained();
         if ((arg->OperGet() == GT_OBJ) && (arg->AsObj()->Addr()->OperGet() == GT_LCL_VAR_ADDR))
@@ -924,6 +924,7 @@ GenTreePtr Lowering::NewPutArg(GenTreeCall* call, GenTreePtr arg, fgArgTabEntryP
             {
                 var_types regType          = fieldListPtr->gtGetOp1()->TypeGet();
                 argSplit->m_regType[index] = regType;
+                fieldListPtr->gtRegNum     = REG_NA;
             }
         }
     }
@@ -1284,21 +1285,20 @@ void Lowering::LowerArg(GenTreeCall* call, GenTreePtr* ppArg)
             GenTreePtr argLo = arg->gtGetOp1();
             GenTreePtr argHi = arg->gtGetOp2();
 
-            GenTreeFieldList* fieldListLow = new (comp, GT_FIELD_LIST) GenTreeFieldList(argLo, 0, TYP_INT, nullptr);
-            GenTreeFieldList* fieldListHigh =
-                new (comp, GT_FIELD_LIST) GenTreeFieldList(argHi, 4, TYP_INT, fieldListLow);
+            GenTreeFieldList* fieldList = new (comp, GT_FIELD_LIST) GenTreeFieldList(argLo, 0, TYP_INT, nullptr);
+            (void)new (comp, GT_FIELD_LIST) GenTreeFieldList(argHi, 4, TYP_INT, fieldList);
 
-            putArg           = NewPutArg(call, fieldListLow, info, TYP_INT);
+            putArg           = NewPutArg(call, fieldList, info, TYP_VOID);
             putArg->gtRegNum = info->regNum;
 
             BlockRange().InsertBefore(arg, putArg);
             BlockRange().Remove(arg);
-            *ppArg     = fieldListLow;
-            info->node = fieldListLow;
+
+            *ppArg     = fieldList;
+            info->node = fieldList;
 
             // Clear the register assignments on the fieldList nodes, as these are contained.
-            fieldListLow->gtRegNum  = REG_NA;
-            fieldListHigh->gtRegNum = REG_NA;
+            fieldList->gtRegNum = REG_NA;
         }
         else
         {