Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/dotnet/runtime.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/coreclr/jit/importer.cpp')
-rw-r--r--src/coreclr/jit/importer.cpp118
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);
}