From 21a9cfe68253a8b21585dd27edfef03d4c8618cf Mon Sep 17 00:00:00 2001 From: Andy Ayers Date: Sat, 9 Nov 2024 08:48:17 -0800 Subject: [PATCH 1/3] JIT: tail merge returns with multiple statements Remove the restriction that a mergeable return have one statement. --- src/coreclr/jit/fgopt.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/coreclr/jit/fgopt.cpp b/src/coreclr/jit/fgopt.cpp index be17f9c711f0b4..dba6507bba4c2c 100644 --- a/src/coreclr/jit/fgopt.cpp +++ b/src/coreclr/jit/fgopt.cpp @@ -6484,9 +6484,7 @@ PhaseStatus Compiler::fgHeadTailMerge(bool early) { iterateTailMerge(block); - // TODO: consider removing hasSingleStmt(), it should find more opportunities - // (with size and TP regressions) - if (block->KindIs(BBJ_RETURN) && block->hasSingleStmt() && (block != genReturnBB)) + if (block->KindIs(BBJ_RETURN) && !block->isEmpty() && (block != genReturnBB)) { retBlocks.Push(block); } From 46fd455a1edffa5745086578dae71a47fc364cff Mon Sep 17 00:00:00 2001 From: Andy Ayers Date: Sat, 9 Nov 2024 15:35:37 -0800 Subject: [PATCH 2/3] fix for no shared return configs --- src/coreclr/jit/fgopt.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/coreclr/jit/fgopt.cpp b/src/coreclr/jit/fgopt.cpp index dba6507bba4c2c..61c2c38f3deec7 100644 --- a/src/coreclr/jit/fgopt.cpp +++ b/src/coreclr/jit/fgopt.cpp @@ -6486,6 +6486,22 @@ PhaseStatus Compiler::fgHeadTailMerge(bool early) if (block->KindIs(BBJ_RETURN) && !block->isEmpty() && (block != genReturnBB)) { + +#if !FEATURE_TAILCALL_OPT_SHARED_RETURN + // Avoid spitting a return away from a possible tail call + // + if (!block->hasSingleStmt()) + { + Statement* const lastStmt = block->lastStmt(); + Statement* const prevStmt = lastStmt->GetPrevStmt(); + GenTree* const prevTree = prevStmt->GetRootNode(); + if (prevTree->IsCall() && prevTree->AsCall()->CanTailCall()) + { + continue; + } + } +#endif + retBlocks.Push(block); } } From 20b037b33c02e4bd3ffd01891d2b82cc05e30fe3 Mon Sep 17 00:00:00 2001 From: Andy Ayers Date: Sun, 10 Nov 2024 11:15:32 -0800 Subject: [PATCH 3/3] don't split tail calls more broadly... morph seems too fragile --- src/coreclr/jit/fgopt.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/coreclr/jit/fgopt.cpp b/src/coreclr/jit/fgopt.cpp index 61c2c38f3deec7..62356cd12fb534 100644 --- a/src/coreclr/jit/fgopt.cpp +++ b/src/coreclr/jit/fgopt.cpp @@ -6486,8 +6486,6 @@ PhaseStatus Compiler::fgHeadTailMerge(bool early) if (block->KindIs(BBJ_RETURN) && !block->isEmpty() && (block != genReturnBB)) { - -#if !FEATURE_TAILCALL_OPT_SHARED_RETURN // Avoid spitting a return away from a possible tail call // if (!block->hasSingleStmt()) @@ -6500,7 +6498,6 @@ PhaseStatus Compiler::fgHeadTailMerge(bool early) continue; } } -#endif retBlocks.Push(block); }