@@ -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 }
0 commit comments