diff options
author | Sivarv <sivarv@microsoft.com> | 2016-01-14 16:36:12 -0800 |
---|---|---|
committer | Sivarv <sivarv@microsoft.com> | 2016-01-14 16:36:12 -0800 |
commit | 17e0299335cd9735c864fdf5c22a64ebc24744a4 (patch) | |
tree | ff80b9bcd4e5fa0385fab4ec7a75d431ad6387f3 /src | |
parent | 36528090d1bc5a3e2b78c7ceadc2766e824321d5 (diff) | |
parent | e251739f011163c2ce4ba536acd3d0434f3ffd6e (diff) | |
download | coreclr-17e0299335cd9735c864fdf5c22a64ebc24744a4.tar.gz coreclr-17e0299335cd9735c864fdf5c22a64ebc24744a4.tar.bz2 coreclr-17e0299335cd9735c864fdf5c22a64ebc24744a4.zip |
Merge pull request #2648 from sivarv/founddiff2
Fix to issue #2349 - Assertion failed '!foundDiff' in 'Node[__Canon][System.__Canon]:Search(ref,ref):ref:this' in lsra.cpp
Diffstat (limited to 'src')
-rw-r--r-- | src/jit/morph.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/src/jit/morph.cpp b/src/jit/morph.cpp index 4d3b086339..35d8b1bd2b 100644 --- a/src/jit/morph.cpp +++ b/src/jit/morph.cpp @@ -6602,9 +6602,18 @@ GenTreePtr Compiler::fgMorphCall(GenTreeCall* call) #if FEATURE_TAILCALL_OPT // TODO-CQ: enable the transformation when the method has a struct parameter that can be passed in a register // or return type is a struct that can be passed in a register. + // + // TODO-CQ: if the method being compiled requires generic context reported in gc-info (either through + // hidden generic context param or through keep alive thisptr), then while transforming a recursive + // call to such a method requires that the generic context stored on stack slot be updated. Right now, + // fgMorphRecursiveFastTailCallIntoLoop() is not handling update of generic context while transforming + // a recursive call into a loop. Another option is to modify gtIsRecursiveCall() to check that the + // generic type parameters of both caller and callee generic method are the same. if (opts.compTailCallLoopOpt && canFastTailCall && gtIsRecursiveCall(call) && + !lvaReportParamTypeArg() && + !lvaKeepAliveAndReportThis() && !call->IsVirtual() && !hasStructParam && !varTypeIsStruct(call->TypeGet())) |