Skip to content

Commit bcbe584

Browse files
author
Sergey Andreenko
committed
Fix for arm32/64.
1 parent 150c119 commit bcbe584

2 files changed

Lines changed: 40 additions & 30 deletions

File tree

src/coreclr/src/jit/lower.cpp

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1303,7 +1303,7 @@ void Lowering::LowerArg(GenTreeCall* call, GenTree** ppArg)
13031303
// TYP_SIMD8 parameters that are passed as longs
13041304
if (type == TYP_SIMD8 && genIsValidIntReg(info->GetRegNum()))
13051305
{
1306-
GenTreeUnOp* bitcast = new (comp, GT_BITCAST) GenTreeOp(GT_BITCAST, TYP_LONG, arg, nullptr);
1306+
GenTree* bitcast = comp->gtNewBitCastNode(TYP_LONG, arg);
13071307
BlockRange().InsertAfter(arg, bitcast);
13081308

13091309
*ppArg = arg = bitcast;
@@ -2935,8 +2935,8 @@ void Lowering::LowerRet(GenTreeUnOp* ret)
29352935
if ((ret->TypeGet() != TYP_VOID) && !varTypeIsStruct(ret) && !varTypeIsStruct(retVal) &&
29362936
(varTypeUsesFloatReg(ret) != varTypeUsesFloatReg(retVal)))
29372937
{
2938-
GenTreeUnOp* bitcast = new (comp, GT_BITCAST) GenTreeOp(GT_BITCAST, ret->TypeGet(), ret->gtGetOp1(), nullptr);
2939-
ret->gtOp1 = bitcast;
2938+
GenTree* bitcast = comp->gtNewBitCastNode(ret->TypeGet(), retVal);
2939+
ret->gtOp1 = bitcast;
29402940
BlockRange().InsertBefore(ret, bitcast);
29412941
ContainCheckBitCast(bitcast);
29422942
}
@@ -2947,6 +2947,15 @@ void Lowering::LowerRet(GenTreeUnOp* ret)
29472947
{
29482948
if (varTypeIsStruct(ret->TypeGet()) != varTypeIsStruct(retVal->TypeGet()))
29492949
{
2950+
if (comp->compDoOldStructRetyping())
2951+
{
2952+
#ifdef FEATURE_SIMD
2953+
assert(ret->TypeIs(TYP_DOUBLE));
2954+
assert(retVal->TypeIs(TYP_SIMD8));
2955+
#else // !FEATURE_SIMD
2956+
unreached();
2957+
#endif // !FEATURE_SIMD
2958+
}
29502959
if (varTypeIsStruct(ret->TypeGet()))
29512960
{
29522961
assert(!comp->compDoOldStructRetyping());
@@ -2971,29 +2980,20 @@ void Lowering::LowerRet(GenTreeUnOp* ret)
29712980

29722981
assert(actualTypesMatch || constStructInit || implicitCastFromSameOrBiggerSize);
29732982
}
2974-
else if (comp->compDoOldStructRetyping())
2975-
{
2976-
#ifdef FEATURE_SIMD
2977-
assert(ret->TypeIs(TYP_DOUBLE));
2978-
assert(retVal->TypeIs(TYP_SIMD8));
2979-
#else // !FEATURE_SIMD
2980-
unreached();
2981-
#endif // !FEATURE_SIMD
2982-
}
2983-
else
2984-
{
2985-
// Return struct as a primitive using Unsafe cast.
2986-
assert(!comp->compDoOldStructRetyping());
2987-
assert(varTypeIsStruct(retVal->TypeGet()));
2988-
LowerRetStructLclVar(ret);
2989-
}
29902983
}
29912984
}
29922985
#endif // DEBUG
29932986
if (varTypeIsStruct(ret))
29942987
{
29952988
LowerRetStruct(ret);
29962989
}
2990+
else if (!ret->TypeIs(TYP_VOID) && varTypeIsStruct(retVal))
2991+
{
2992+
// Return struct as a primitive using Unsafe cast.
2993+
assert(!comp->compDoOldStructRetyping());
2994+
assert(retVal->OperIs(GT_LCL_VAR));
2995+
LowerRetStructLclVar(ret);
2996+
}
29972997
}
29982998

29992999
// Method doing PInvokes has exactly one return block unless it has tail calls.
@@ -3020,9 +3020,9 @@ void Lowering::LowerStoreLocCommon(GenTreeLclVarCommon* lclStore)
30203020
{
30213021
if (m_lsra->isRegCandidate(varDsc))
30223022
{
3023-
GenTreeUnOp* bitcast = new (comp, GT_BITCAST) GenTreeOp(GT_BITCAST, lclStore->TypeGet(), src, nullptr);
3024-
lclStore->gtOp1 = bitcast;
3025-
src = lclStore->gtGetOp1();
3023+
GenTree* bitcast = comp->gtNewBitCastNode(lclStore->TypeGet(), src);
3024+
lclStore->gtOp1 = bitcast;
3025+
src = lclStore->gtGetOp1();
30263026
BlockRange().InsertBefore(lclStore, bitcast);
30273027
ContainCheckBitCast(bitcast);
30283028
}
@@ -3092,9 +3092,8 @@ void Lowering::LowerStoreLocCommon(GenTreeLclVarCommon* lclStore)
30923092

30933093
if (varTypeUsesFloatReg(lclStore) != varTypeUsesFloatReg(call))
30943094
{
3095-
GenTreeUnOp* bitcast =
3096-
new (comp, GT_BITCAST) GenTreeOp(GT_BITCAST, lclStore->TypeGet(), call, nullptr);
3097-
lclStore->gtOp1 = bitcast;
3095+
GenTree* bitcast = comp->gtNewBitCastNode(lclStore->TypeGet(), call);
3096+
lclStore->gtOp1 = bitcast;
30983097
BlockRange().InsertBefore(lclStore, bitcast);
30993098
ContainCheckBitCast(bitcast);
31003099
}
@@ -3156,6 +3155,13 @@ void Lowering::LowerRetStruct(GenTreeUnOp* ret)
31563155
else
31573156
{
31583157
assert(comp->info.compRetNativeType == TYP_SIMD16);
3158+
GenTree* retVal = ret->gtGetOp1();
3159+
if (!retVal->TypeIs(TYP_SIMD16))
3160+
{
3161+
assert(retVal->OperIs(GT_LCL_VAR));
3162+
assert(!comp->compDoOldStructRetyping());
3163+
LowerRetStructLclVar(ret);
3164+
}
31593165
return;
31603166
}
31613167
}
@@ -3216,8 +3222,8 @@ void Lowering::LowerRetStruct(GenTreeUnOp* ret)
32163222
assert(!retVal->TypeIs(TYP_STRUCT));
32173223
if (varTypeUsesFloatReg(ret) != varTypeUsesFloatReg(retVal))
32183224
{
3219-
GenTreeUnOp* bitcast = new (comp, GT_BITCAST) GenTreeOp(GT_BITCAST, ret->TypeGet(), retVal, nullptr);
3220-
ret->gtOp1 = bitcast;
3225+
GenTree* bitcast = comp->gtNewBitCastNode(ret->TypeGet(), retVal);
3226+
ret->gtOp1 = bitcast;
32213227
BlockRange().InsertBefore(ret, bitcast);
32223228
ContainCheckBitCast(bitcast);
32233229
}
@@ -3303,8 +3309,8 @@ void Lowering::LowerRetStructLclVar(GenTreeUnOp* ret)
33033309

33043310
if (varTypeUsesFloatReg(ret) != varTypeUsesFloatReg(lclVarType))
33053311
{
3306-
GenTreeUnOp* bitcast = new (comp, GT_BITCAST) GenTreeOp(GT_BITCAST, ret->TypeGet(), lclVar, nullptr);
3307-
ret->gtOp1 = bitcast;
3312+
GenTree* bitcast = comp->gtNewBitCastNode(ret->TypeGet(), lclVar);
3313+
ret->gtOp1 = bitcast;
33083314
BlockRange().InsertBefore(ret, bitcast);
33093315
ContainCheckBitCast(bitcast);
33103316
}

src/coreclr/src/jit/lsraarm.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -773,7 +773,11 @@ int LinearScan::BuildNode(GenTree* tree)
773773
{
774774
assert(dstCount == 1);
775775
regNumber argReg = tree->GetRegNum();
776-
regMaskTP argMask = genRegMask(argReg);
776+
regMaskTP argMask = RBM_NONE;
777+
if (argReg != REG_COUNT)
778+
{
779+
argMask = genRegMask(argReg);
780+
}
777781

778782
// If type of node is `long` then it is actually `double`.
779783
// The actual `long` types must have been transformed as a field list with two fields.

0 commit comments

Comments
 (0)