From de3b59386e92e94f9246e197c20500f27b0ebf83 Mon Sep 17 00:00:00 2001 From: Hyeongseok Oh Date: Thu, 24 Aug 2017 10:27:18 +0900 Subject: [PATCH] Fix regeression with Containment - SetContained for GT_FIELD_LIST - OperIsMultiRegOp return true for armel only - Simplify lowering long argument and fix type --- src/jit/gentree.h | 2 +- src/jit/lower.cpp | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/jit/gentree.h b/src/jit/gentree.h index da3df1e..f1d3ff4 100644 --- a/src/jit/gentree.h +++ b/src/jit/gentree.h @@ -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; diff --git a/src/jit/lower.cpp b/src/jit/lower.cpp index 3e3f5a4..5351e44 100644 --- a/src/jit/lower.cpp +++ b/src/jit/lower.cpp @@ -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 { -- 2.7.4