diff options
Diffstat (limited to 'src/coreclr/jit/importer.cpp')
-rw-r--r-- | src/coreclr/jit/importer.cpp | 118 |
1 files changed, 59 insertions, 59 deletions
diff --git a/src/coreclr/jit/importer.cpp b/src/coreclr/jit/importer.cpp index 8002890e3b8..65fb915f783 100644 --- a/src/coreclr/jit/importer.cpp +++ b/src/coreclr/jit/importer.cpp @@ -4528,7 +4528,6 @@ GenTree* Compiler::impImportStaticFieldAccess(CORINFO_RESOLVED_TOKEN* pResolvedT } else // We need the value of a static field { - // In future, it may be better to just create the right tree here instead of folding it later. op1 = gtNewFieldRef(lclTyp, pResolvedToken->hField); if (pFieldInfo->fieldFlags & CORINFO_FLG_FIELD_INITCLASS) @@ -4561,9 +4560,7 @@ GenTree* Compiler::impImportStaticFieldAccess(CORINFO_RESOLVED_TOKEN* pResolvedT if (isBoxedStatic) { - op1 = gtNewOperNode(GT_IND, TYP_REF, op1); - op1->gtFlags |= (GTF_IND_INVARIANT | GTF_IND_NONFAULTING | GTF_IND_NONNULL); - + op1 = gtNewIndir(TYP_REF, op1, GTF_IND_INVARIANT | GTF_IND_NONFAULTING | GTF_IND_NONNULL); op1 = gtNewOperNode(GT_ADD, TYP_BYREF, op1, gtNewIconNode(TARGET_POINTER_SIZE, outerFldSeq)); } @@ -9413,12 +9410,10 @@ void Compiler::impImportBlockCode(BasicBlock* block) int aflags = isLoadAddress ? CORINFO_ACCESS_ADDRESS : CORINFO_ACCESS_GET; GenTree* obj = nullptr; - typeInfo* tiObj = nullptr; CORINFO_CLASS_HANDLE objType = nullptr; // used for fields - if (opcode == CEE_LDFLD || opcode == CEE_LDFLDA) + if ((opcode == CEE_LDFLD) || (opcode == CEE_LDFLDA)) { - tiObj = &impStackTop().seTypeInfo; StackEntry se = impPopStack(); objType = se.seTypeInfo.GetClassHandle(); obj = se.val; @@ -9540,8 +9535,19 @@ void Compiler::impImportBlockCode(BasicBlock* block) obj = impGetStructAddr(obj, objType, CHECK_SPILL_ALL, true); } - /* Create the data member node */ - op1 = gtNewFieldRef(lclTyp, resolvedToken.hField, obj, fieldInfo.offset); + DWORD typeFlags = info.compCompHnd->getClassAttribs(resolvedToken.hClass); + + // TODO-ADDR: use FIELD_ADDR for all fields, not just those of classes. + // + if (isLoadAddress && ((typeFlags & CORINFO_FLG_VALUECLASS) == 0)) + { + op1 = gtNewFieldAddrNode(varTypeIsGC(obj) ? TYP_BYREF : TYP_I_IMPL, resolvedToken.hField, + obj, fieldInfo.offset); + } + else + { + op1 = gtNewFieldRef(lclTyp, resolvedToken.hField, obj, fieldInfo.offset); + } #ifdef FEATURE_READYTORUN if (fieldInfo.fieldAccessor == CORINFO_FIELD_INSTANCE_WITH_BASE) @@ -9555,26 +9561,22 @@ void Compiler::impImportBlockCode(BasicBlock* block) op1->gtFlags |= GTF_EXCEPT; } - DWORD typeFlags = info.compCompHnd->getClassAttribs(resolvedToken.hClass); if (StructHasOverlappingFields(typeFlags)) { op1->AsField()->gtFldMayOverlap = true; } - // wrap it in a address of operator if necessary - if (isLoadAddress) + // Wrap it in a address of operator if necessary. + if (isLoadAddress && op1->OperIs(GT_FIELD)) { - op1 = gtNewOperNode(GT_ADDR, - (var_types)(varTypeIsGC(obj->TypeGet()) ? TYP_BYREF : TYP_I_IMPL), op1); + op1 = gtNewOperNode(GT_ADDR, varTypeIsGC(obj) ? TYP_BYREF : TYP_I_IMPL, op1); } - else + + if (!isLoadAddress && compIsForInlining() && + impInlineIsGuaranteedThisDerefBeforeAnySideEffects(nullptr, nullptr, obj, + impInlineInfo->inlArgInfo)) { - if (compIsForInlining() && - impInlineIsGuaranteedThisDerefBeforeAnySideEffects(nullptr, nullptr, obj, - impInlineInfo->inlArgInfo)) - { - impInlineInfo->thisDereferencedFirst = true; - } + impInlineInfo->thisDereferencedFirst = true; } } break; @@ -9582,22 +9584,27 @@ void Compiler::impImportBlockCode(BasicBlock* block) case CORINFO_FIELD_STATIC_TLS: #ifdef TARGET_X86 // Legacy TLS access is implemented as intrinsic on x86 only + op1 = gtNewFieldAddrNode(TYP_I_IMPL, resolvedToken.hField, nullptr, fieldInfo.offset); + op1->gtFlags |= GTF_FLD_TLS; // fgMorphExpandTlsField will handle the transformation. - /* Create the data member node */ - op1 = gtNewFieldRef(lclTyp, resolvedToken.hField, NULL, fieldInfo.offset); - op1->gtFlags |= GTF_IND_TLS_REF; // fgMorphField will handle the transformation - - if (isLoadAddress) + if (!isLoadAddress) { - op1 = gtNewOperNode(GT_ADDR, (var_types)TYP_I_IMPL, op1); + if (varTypeIsStruct(lclTyp)) + { + op1 = gtNewObjNode(fieldInfo.structType, op1); + op1->gtFlags |= GTF_IND_NONFAULTING; + } + else + { + op1 = gtNewIndir(lclTyp, op1, GTF_IND_NONFAULTING); + op1->gtFlags |= GTF_GLOB_REF; + } } break; #else fieldInfo.fieldAccessor = CORINFO_FIELD_STATIC_ADDR_HELPER; - FALLTHROUGH; #endif - case CORINFO_FIELD_STATIC_ADDR_HELPER: case CORINFO_FIELD_INSTANCE_HELPER: case CORINFO_FIELD_INSTANCE_ADDR_HELPER: @@ -9675,8 +9682,7 @@ void Compiler::impImportBlockCode(BasicBlock* block) if (!usesHelper) { - assert((op1->OperGet() == GT_FIELD) || (op1->OperGet() == GT_IND) || - (op1->OperGet() == GT_OBJ)); + assert(op1->OperIs(GT_FIELD, GT_IND, GT_OBJ)); op1->gtFlags |= GTF_IND_VOLATILE; } } @@ -9685,15 +9691,13 @@ void Compiler::impImportBlockCode(BasicBlock* block) { if (!usesHelper) { - assert((op1->OperGet() == GT_FIELD) || (op1->OperGet() == GT_IND) || - (op1->OperGet() == GT_OBJ)); + assert(op1->OperIs(GT_FIELD, GT_IND, GT_OBJ)); op1->gtFlags |= GTF_IND_UNALIGNED; } } } - /* Check if the class needs explicit initialization */ - + // Check if the class needs explicit initialization. if (fieldInfo.fieldFlags & CORINFO_FLG_FIELD_INITCLASS) { GenTree* helperNode = impInitClass(&resolvedToken); @@ -9728,21 +9732,17 @@ void Compiler::impImportBlockCode(BasicBlock* block) JITDUMP(" %08X", resolvedToken.token); - int aflags = CORINFO_ACCESS_SET; - GenTree* obj = nullptr; - typeInfo* tiObj = nullptr; - typeInfo tiVal; + int aflags = CORINFO_ACCESS_SET; + GenTree* obj = nullptr; - /* Pull the value from the stack */ + // Pull the value from the stack. StackEntry se = impPopStack(); op2 = se.val; - tiVal = se.seTypeInfo; - clsHnd = tiVal.GetClassHandle(); + clsHnd = se.seTypeInfo.GetClassHandle(); if (opcode == CEE_STFLD) { - tiObj = &impStackTop().seTypeInfo; - obj = impPopStack().val; + obj = impPopStack().val; if (impIsThis(obj)) { @@ -9850,19 +9850,25 @@ void Compiler::impImportBlockCode(BasicBlock* block) case CORINFO_FIELD_STATIC_TLS: #ifdef TARGET_X86 - // Legacy TLS access is implemented as intrinsic on x86 only - - /* Create the data member node */ - op1 = gtNewFieldRef(lclTyp, resolvedToken.hField, NULL, fieldInfo.offset); - op1->gtFlags |= GTF_IND_TLS_REF; // fgMorphField will handle the transformation + // Legacy TLS access is implemented as intrinsic on x86 only. + op1 = gtNewFieldAddrNode(TYP_I_IMPL, resolvedToken.hField, nullptr, fieldInfo.offset); + op1->gtFlags |= GTF_FLD_TLS; // fgMorphExpandTlsField will handle the transformation. + if (varTypeIsStruct(lclTyp)) + { + op1 = gtNewObjNode(fieldInfo.structType, op1); + op1->gtFlags |= GTF_IND_NONFAULTING; + } + else + { + op1 = gtNewIndir(lclTyp, op1, GTF_IND_NONFAULTING); + op1->gtFlags |= GTF_GLOB_REF; + } break; #else fieldInfo.fieldAccessor = CORINFO_FIELD_STATIC_ADDR_HELPER; - FALLTHROUGH; #endif - case CORINFO_FIELD_STATIC_ADDR_HELPER: case CORINFO_FIELD_INSTANCE_HELPER: case CORINFO_FIELD_INSTANCE_ADDR_HELPER: @@ -9960,14 +9966,8 @@ void Compiler::impImportBlockCode(BasicBlock* block) } #endif - // We can generate an assignment to a TYP_FLOAT from a TYP_DOUBLE - // We insert a cast to the dest 'op1' type - // - if ((op1->TypeGet() != op2->TypeGet()) && varTypeIsFloating(op1->gtType) && - varTypeIsFloating(op2->gtType)) - { - op2 = gtNewCastNode(op1->TypeGet(), op2, false, op1->TypeGet()); - } + // Insert an implicit FLOAT<->DOUBLE cast if needed. + op2 = impImplicitR4orR8Cast(op2, op1->TypeGet()); op1 = gtNewAssignNode(op1, op2); } |