diff options
author | Eugene Rozenfeld <erozen@microsoft.com> | 2019-01-29 11:26:49 -0800 |
---|---|---|
committer | Eugene Rozenfeld <erozen@microsoft.com> | 2019-01-30 14:10:49 -0800 |
commit | 4070994640bcc2c4c138b6f695d3fce14ea3efe7 (patch) | |
tree | 3f2bc61d4bec7bc503fb0c7fda3fed92898a1fc3 /src/jit/morph.cpp | |
parent | 91e1ffccc38fc87f6f496eb056396a1b775f08af (diff) | |
download | coreclr-4070994640bcc2c4c138b6f695d3fce14ea3efe7.tar.gz coreclr-4070994640bcc2c4c138b6f695d3fce14ea3efe7.tar.bz2 coreclr-4070994640bcc2c4c138b6f695d3fce14ea3efe7.zip |
Remove GTF_ADDR_ONSTACK and IsVarAddr.
IsVarAddr was checking GTF_ADDR_ONSTACK to determine if
the GT_ADDR node is an address of a local. This change removes both
GTF_ADDR_ONSTACK and IsVarAddr and uses IsLocalAdrExpr instead.
IsLocalAddrExpr uses opcodes to determine if GT_ADDR node is
a local address.
GTF_ADDR_ONSTACK flag is ancient, added before 2002 so I couldn't find
the checkin that introduced it.
I changed the assert to a check and an assignment since simplifications
inside fgMorphArgs between
https://github.com/dotnet/coreclr/blob/1a1e4c4d5a8030cb8d82a2e5b06c2ab357b92534/src/jit/morph.cpp#L3709
(which causes https://github.com/dotnet/coreclr/blob/1a1e4c4d5a8030cb8d82a2e5b06c2ab357b92534/src/jit/morph.cpp#L3057)
and
https://github.com/dotnet/coreclr/blob/1a1e4c4d5a8030cb8d82a2e5b06c2ab357b92534/src/jit/morph.cpp#L3790
may result in more GT_ADDR nodes recognized by IsLocalAdrExpr.
x86 and x64 pmi frameworks had no code diffs and some gcinfo reductions
(15 methods with gcinfo diffs in x86).
Fixes #22190.
Diffstat (limited to 'src/jit/morph.cpp')
-rw-r--r-- | src/jit/morph.cpp | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/src/jit/morph.cpp b/src/jit/morph.cpp index efe8ec9fe8..f83fdaeb17 100644 --- a/src/jit/morph.cpp +++ b/src/jit/morph.cpp @@ -1619,7 +1619,7 @@ void fgArgInfo::ArgsComplete() case 7: // If we have a stack based LclVar we can perform a wider read of 4 or 8 bytes // - if (argObj->gtObj.gtOp1->IsVarAddr() == false) // Is the source not a LclVar? + if (argObj->gtObj.gtOp1->IsLocalAddrExpr() == nullptr) // Is the source not a LclVar? { // If we don't have a LclVar we need to read exactly 3,5,6 or 7 bytes // For now we use a a GT_CPBLK to copy the exact size into a GT_LCL_VAR temp. @@ -3052,7 +3052,7 @@ void Compiler::fgInitArgInfo(GenTreeCall* call) // Change the node to TYP_I_IMPL so we don't report GC info // NOTE: We deferred this from the importer because of the inliner. - if (argx->IsVarAddr()) + if (argx->IsLocalAddrExpr() != nullptr) { argx->gtType = TYP_I_IMPL; } @@ -3786,8 +3786,10 @@ GenTreeCall* Compiler::fgMorphArgs(GenTreeCall* call) assert(size != 0); argSlots += argEntry->getSlotCount(); - // lclVar address should have been retyped to TYP_I_IMPL. - assert(!argx->IsVarAddr() || (argx->gtType == TYP_I_IMPL)); + if (argx->IsLocalAddrExpr() != nullptr) + { + argx->gtType = TYP_I_IMPL; + } // Get information about this argument. var_types hfaType = argEntry->hfaType; @@ -4077,7 +4079,7 @@ GenTreeCall* Compiler::fgMorphArgs(GenTreeCall* call) // There are a few special cases where we can omit using a CopyBlk // where we normally would need to use one. - if (argObj->gtObj.gtOp1->IsVarAddr()) // Is the source a LclVar? + if (argObj->gtObj.gtOp1->IsLocalAddrExpr() != nullptr) // Is the source a LclVar? { copyBlkClass = NO_CLASS_HANDLE; } |