From a6e9098ffc9adf987be1e4dbe12589b75f46dd1d Mon Sep 17 00:00:00 2001 From: Carol Eidt Date: Wed, 15 Apr 2020 13:02:20 -0700 Subject: [PATCH] Fix some flag uses (#34969) * Fix some flag uses --- src/coreclr/src/jit/importer.cpp | 9 ++++++--- src/coreclr/src/jit/lclvars.cpp | 3 ++- src/coreclr/src/jit/lsra.cpp | 2 +- src/coreclr/src/jit/treelifeupdater.cpp | 6 +++--- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/coreclr/src/jit/importer.cpp b/src/coreclr/src/jit/importer.cpp index 76b4dd9..ae7a100 100644 --- a/src/coreclr/src/jit/importer.cpp +++ b/src/coreclr/src/jit/importer.cpp @@ -1288,9 +1288,12 @@ GenTree* Compiler::impAssignStructPtr(GenTree* destAddr, src->gtType = genActualType(returnType); call->gtType = src->gtType; - // !!! The destination could be on stack. !!! - // This flag will let us choose the correct write barrier. - destFlags = GTF_IND_TGTANYWHERE; + if ((destAddr->gtOper != GT_ADDR) || (destAddr->AsOp()->gtOp1->gtOper != GT_LCL_VAR)) + { + // !!! The destination could be on stack. !!! + // This flag will let us choose the correct write barrier. + destFlags = GTF_IND_TGTANYWHERE; + } } } else if (src->OperIsBlk()) diff --git a/src/coreclr/src/jit/lclvars.cpp b/src/coreclr/src/jit/lclvars.cpp index 3cd2244..e37b59d 100644 --- a/src/coreclr/src/jit/lclvars.cpp +++ b/src/coreclr/src/jit/lclvars.cpp @@ -3794,7 +3794,8 @@ void Compiler::lvaMarkLclRefs(GenTree* tree, BasicBlock* block, Statement* stmt, allowStructs || genActualType(varDsc->TypeGet()) == genActualType(tree->gtType) || (tree->gtType == TYP_BYREF && varDsc->TypeGet() == TYP_I_IMPL) || (tree->gtType == TYP_I_IMPL && varDsc->TypeGet() == TYP_BYREF) || (tree->gtFlags & GTF_VAR_CAST) || - varTypeIsFloating(varDsc->TypeGet()) && varTypeIsFloating(tree->gtType)); + (varTypeIsFloating(varDsc) && varTypeIsFloating(tree)) || + (varTypeIsStruct(varDsc) == varTypeIsStruct(tree))); /* Remember the type of the reference */ diff --git a/src/coreclr/src/jit/lsra.cpp b/src/coreclr/src/jit/lsra.cpp index c3f647e..24c610f 100644 --- a/src/coreclr/src/jit/lsra.cpp +++ b/src/coreclr/src/jit/lsra.cpp @@ -9443,7 +9443,7 @@ void LinearScan::lsraGetOperandString(GenTree* tree, unsigned operandStringLength) { const char* lastUseChar = ""; - if ((tree->gtFlags & GTF_VAR_DEATH) != 0) + if (tree->OperIsScalarLocal() && ((tree->gtFlags & GTF_VAR_DEATH) != 0)) { lastUseChar = "*"; } diff --git a/src/coreclr/src/jit/treelifeupdater.cpp b/src/coreclr/src/jit/treelifeupdater.cpp index f373e0c..b903c90 100644 --- a/src/coreclr/src/jit/treelifeupdater.cpp +++ b/src/coreclr/src/jit/treelifeupdater.cpp @@ -74,9 +74,9 @@ void TreeLifeUpdater::UpdateLifeVar(GenTree* tree) } // if it's a partial definition then variable "x" must have had a previous, original, site to be born. - bool isBorn = ((tree->gtFlags & GTF_VAR_DEF) != 0 && (tree->gtFlags & GTF_VAR_USEASG) == 0); - bool isDying = ((tree->gtFlags & GTF_VAR_DEATH) != 0); - bool spill = ((tree->gtFlags & GTF_SPILL) != 0); + bool isBorn = ((lclVarTree->gtFlags & GTF_VAR_DEF) != 0 && (lclVarTree->gtFlags & GTF_VAR_USEASG) == 0); + bool isDying = ((lclVarTree->gtFlags & GTF_VAR_DEATH) != 0); + bool spill = ((lclVarTree->gtFlags & GTF_SPILL) != 0); // Since all tracked vars are register candidates, but not all are in registers at all times, // we maintain two separate sets of variables - the total set of variables that are either -- 2.7.4