summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSivarv <sivarv@microsoft.com>2016-01-14 16:36:12 -0800
committerSivarv <sivarv@microsoft.com>2016-01-14 16:36:12 -0800
commit17e0299335cd9735c864fdf5c22a64ebc24744a4 (patch)
treeff80b9bcd4e5fa0385fab4ec7a75d431ad6387f3 /src
parent36528090d1bc5a3e2b78c7ceadc2766e824321d5 (diff)
parente251739f011163c2ce4ba536acd3d0434f3ffd6e (diff)
downloadcoreclr-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.cpp9
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()))