From 07dc0bfa6222c855ef29c4e7e209a1e8f03ebc9b Mon Sep 17 00:00:00 2001 From: EgorBo Date: Wed, 24 Feb 2021 17:16:46 +0300 Subject: [PATCH 01/12] handle non-void noreturns --- src/coreclr/jit/flowgraph.cpp | 48 ++++++++++++++++++++++------------- src/coreclr/jit/morph.cpp | 9 +------ src/coreclr/jit/utils.cpp | 4 +++ 3 files changed, 36 insertions(+), 25 deletions(-) diff --git a/src/coreclr/jit/flowgraph.cpp b/src/coreclr/jit/flowgraph.cpp index d6a9ed7642b159..54f3186373ca2c 100644 --- a/src/coreclr/jit/flowgraph.cpp +++ b/src/coreclr/jit/flowgraph.cpp @@ -684,32 +684,46 @@ PhaseStatus Compiler::fgImport() bool Compiler::fgIsThrow(GenTree* tree) { - if ((tree->gtOper != GT_CALL) || (tree->AsCall()->gtCallType != CT_HELPER)) + if (!tree->IsCall()) { return false; } - // TODO-Throughput: Replace all these calls to eeFindHelper() with a table based lookup - - if ((tree->AsCall()->gtCallMethHnd == eeFindHelper(CORINFO_HELP_OVERFLOW)) || - (tree->AsCall()->gtCallMethHnd == eeFindHelper(CORINFO_HELP_VERIFICATION)) || - (tree->AsCall()->gtCallMethHnd == eeFindHelper(CORINFO_HELP_RNGCHKFAIL)) || - (tree->AsCall()->gtCallMethHnd == eeFindHelper(CORINFO_HELP_THROWDIVZERO)) || - (tree->AsCall()->gtCallMethHnd == eeFindHelper(CORINFO_HELP_THROWNULLREF)) || - (tree->AsCall()->gtCallMethHnd == eeFindHelper(CORINFO_HELP_THROW)) || - (tree->AsCall()->gtCallMethHnd == eeFindHelper(CORINFO_HELP_RETHROW)) || - (tree->AsCall()->gtCallMethHnd == eeFindHelper(CORINFO_HELP_THROW_TYPE_NOT_SUPPORTED)) || - (tree->AsCall()->gtCallMethHnd == eeFindHelper(CORINFO_HELP_THROW_PLATFORM_NOT_SUPPORTED))) + GenTreeCall* call = tree->AsCall(); + if (call->IsNoReturn()) { - noway_assert(tree->gtFlags & GTF_CALL); - noway_assert(tree->gtFlags & GTF_EXCEPT); return true; } - // TODO-CQ: there are a bunch of managed methods in System.ThrowHelper - // that would be nice to recognize. + if (call->gtCallType != CT_HELPER) + { + return false; + } - return false; + switch (eeGetHelperNum(call->gtCallMethHnd)) + { + case CORINFO_HELP_OVERFLOW: + case CORINFO_HELP_VERIFICATION: + case CORINFO_HELP_RNGCHKFAIL: + case CORINFO_HELP_THROWDIVZERO: + case CORINFO_HELP_THROWNULLREF: + case CORINFO_HELP_THROW: + case CORINFO_HELP_RETHROW: + case CORINFO_HELP_THROW_TYPE_NOT_SUPPORTED: + case CORINFO_HELP_THROW_PLATFORM_NOT_SUPPORTED: + case CORINFO_HELP_FAIL_FAST: + case CORINFO_HELP_METHOD_ACCESS_EXCEPTION: + case CORINFO_HELP_FIELD_ACCESS_EXCEPTION: + case CORINFO_HELP_CLASS_ACCESS_EXCEPTION: + case CORINFO_HELP_THROW_ARGUMENTEXCEPTION: + case CORINFO_HELP_THROW_ARGUMENTOUTOFRANGEEXCEPTION: + case CORINFO_HELP_THROW_NOT_IMPLEMENTED: + noway_assert(call->gtFlags & GTF_CALL); + noway_assert(call->gtFlags & GTF_EXCEPT); + return true; + default: + return false; + } } /***************************************************************************** diff --git a/src/coreclr/jit/morph.cpp b/src/coreclr/jit/morph.cpp index 0c07628678cddc..a6e9c5d41782f7 100644 --- a/src/coreclr/jit/morph.cpp +++ b/src/coreclr/jit/morph.cpp @@ -9309,15 +9309,8 @@ GenTree* Compiler::fgMorphCall(GenTreeCall* call) // BBJ_THROW would result in the tail call being dropped as the epilog is generated // only for BBJ_RETURN blocks. // - // Currently this doesn't work for non-void callees. Some of the code that handles - // fgRemoveRestOfBlock expects the tree to have GTF_EXCEPT flag set but call nodes - // do not have this flag by default. We could add the flag here but the proper solution - // would be to replace the return expression with a local var node during inlining - // so the rest of the call tree stays in a separate statement. That statement can then - // be removed by fgRemoveRestOfBlock without needing to add GTF_EXCEPT anywhere. - // - if (!call->IsTailCall() && call->TypeGet() == TYP_VOID) + if (!call->IsTailCall() && (call->TypeIs(TYP_VOID) || (call->gtFlags & GTF_EXCEPT))) { fgRemoveRestOfBlock = true; } diff --git a/src/coreclr/jit/utils.cpp b/src/coreclr/jit/utils.cpp index c973f6f63c876d..0d5584265354f0 100644 --- a/src/coreclr/jit/utils.cpp +++ b/src/coreclr/jit/utils.cpp @@ -1458,6 +1458,10 @@ void HelperCallProperties::init() case CORINFO_HELP_THROW_NOT_IMPLEMENTED: case CORINFO_HELP_THROW_PLATFORM_NOT_SUPPORTED: case CORINFO_HELP_THROW_TYPE_NOT_SUPPORTED: + case CORINFO_HELP_FAIL_FAST: + case CORINFO_HELP_METHOD_ACCESS_EXCEPTION: + case CORINFO_HELP_FIELD_ACCESS_EXCEPTION: + case CORINFO_HELP_CLASS_ACCESS_EXCEPTION: break; From 6b2ea293077a80cc963433d4895a4533148e730b Mon Sep 17 00:00:00 2001 From: EgorBo Date: Wed, 24 Feb 2021 19:36:41 +0300 Subject: [PATCH 02/12] Introduce AlwaysThrow --- src/coreclr/jit/flowgraph.cpp | 31 ++++--------------------------- src/coreclr/jit/utils.cpp | 3 +++ src/coreclr/jit/utils.h | 8 ++++++++ 3 files changed, 15 insertions(+), 27 deletions(-) diff --git a/src/coreclr/jit/flowgraph.cpp b/src/coreclr/jit/flowgraph.cpp index 54f3186373ca2c..04841cf82fac35 100644 --- a/src/coreclr/jit/flowgraph.cpp +++ b/src/coreclr/jit/flowgraph.cpp @@ -695,35 +695,12 @@ bool Compiler::fgIsThrow(GenTree* tree) return true; } - if (call->gtCallType != CT_HELPER) + if ((call->gtCallType == CT_HELPER) && s_helperCallProperties.AlwaysThrow(eeGetHelperNum(call->gtCallMethHnd))) { - return false; - } - - switch (eeGetHelperNum(call->gtCallMethHnd)) - { - case CORINFO_HELP_OVERFLOW: - case CORINFO_HELP_VERIFICATION: - case CORINFO_HELP_RNGCHKFAIL: - case CORINFO_HELP_THROWDIVZERO: - case CORINFO_HELP_THROWNULLREF: - case CORINFO_HELP_THROW: - case CORINFO_HELP_RETHROW: - case CORINFO_HELP_THROW_TYPE_NOT_SUPPORTED: - case CORINFO_HELP_THROW_PLATFORM_NOT_SUPPORTED: - case CORINFO_HELP_FAIL_FAST: - case CORINFO_HELP_METHOD_ACCESS_EXCEPTION: - case CORINFO_HELP_FIELD_ACCESS_EXCEPTION: - case CORINFO_HELP_CLASS_ACCESS_EXCEPTION: - case CORINFO_HELP_THROW_ARGUMENTEXCEPTION: - case CORINFO_HELP_THROW_ARGUMENTOUTOFRANGEEXCEPTION: - case CORINFO_HELP_THROW_NOT_IMPLEMENTED: - noway_assert(call->gtFlags & GTF_CALL); - noway_assert(call->gtFlags & GTF_EXCEPT); - return true; - default: - return false; + noway_assert(call->gtFlags & GTF_EXCEPT); + return true; } + return false; } /***************************************************************************** diff --git a/src/coreclr/jit/utils.cpp b/src/coreclr/jit/utils.cpp index 0d5584265354f0..dafa816193cb77 100644 --- a/src/coreclr/jit/utils.cpp +++ b/src/coreclr/jit/utils.cpp @@ -1217,6 +1217,7 @@ void HelperCallProperties::init() // bool isPure = false; // true if the result only depends upon input args and not any global state bool noThrow = false; // true if the helper will never throw + bool alwaysThrow = false; // true if the helper will always throw bool nonNullReturn = false; // true if the result will never be null or zero bool isAllocator = false; // true if the result is usually a newly created heap item, or may throw OutOfMemory bool mutatesHeap = false; // true if any previous heap objects [are|can be] modified @@ -1463,6 +1464,7 @@ void HelperCallProperties::init() case CORINFO_HELP_FIELD_ACCESS_EXCEPTION: case CORINFO_HELP_CLASS_ACCESS_EXCEPTION: + alwaysThrow = true; break; // These helper calls may throw an exception @@ -1502,6 +1504,7 @@ void HelperCallProperties::init() m_isPure[helper] = isPure; m_noThrow[helper] = noThrow; + m_alwaysThrow[helper] = alwaysThrow; m_nonNullReturn[helper] = nonNullReturn; m_isAllocator[helper] = isAllocator; m_mutatesHeap[helper] = mutatesHeap; diff --git a/src/coreclr/jit/utils.h b/src/coreclr/jit/utils.h index 2a50680229efd3..3f08f3e25618d7 100644 --- a/src/coreclr/jit/utils.h +++ b/src/coreclr/jit/utils.h @@ -451,6 +451,7 @@ class HelperCallProperties private: bool m_isPure[CORINFO_HELP_COUNT]; bool m_noThrow[CORINFO_HELP_COUNT]; + bool m_alwaysThrow[CORINFO_HELP_COUNT]; bool m_nonNullReturn[CORINFO_HELP_COUNT]; bool m_isAllocator[CORINFO_HELP_COUNT]; bool m_mutatesHeap[CORINFO_HELP_COUNT]; @@ -478,6 +479,13 @@ class HelperCallProperties return m_noThrow[helperId]; } + bool AlwaysThrow(CorInfoHelpFunc helperId) + { + assert(helperId > CORINFO_HELP_UNDEF); + assert(helperId < CORINFO_HELP_COUNT); + return m_alwaysThrow[helperId]; + } + bool NonNullReturn(CorInfoHelpFunc helperId) { assert(helperId > CORINFO_HELP_UNDEF); From d44b5bcb6a9ebf61858224bf688f0fa7879c5ca4 Mon Sep 17 00:00:00 2001 From: EgorBo Date: Wed, 24 Feb 2021 22:55:00 +0300 Subject: [PATCH 03/12] remove assert --- src/coreclr/jit/morph.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/coreclr/jit/morph.cpp b/src/coreclr/jit/morph.cpp index a6e9c5d41782f7..b3119206cdee35 100644 --- a/src/coreclr/jit/morph.cpp +++ b/src/coreclr/jit/morph.cpp @@ -14801,7 +14801,6 @@ GenTree* Compiler::fgMorphSmpOp(GenTree* tree, MorphAddrContext* mac) } GenTree* throwNode = op1->AsOp()->gtOp1; - noway_assert(throwNode->gtType == TYP_VOID); if (oper == GT_COMMA) { From 44983665177b416f3064594f62771bf1d2cbc78c Mon Sep 17 00:00:00 2001 From: EgorBo Date: Thu, 25 Feb 2021 21:01:33 +0300 Subject: [PATCH 04/12] Add a test --- src/coreclr/jit/morph.cpp | 3 +- .../JIT/opt/ThrowHelper/NonVoidThrowHelper.cs | 177 ++++++++++++++++++ .../opt/ThrowHelper/NonVoidThrowHelper.csproj | 9 + 3 files changed, 187 insertions(+), 2 deletions(-) create mode 100644 src/tests/JIT/opt/ThrowHelper/NonVoidThrowHelper.cs create mode 100644 src/tests/JIT/opt/ThrowHelper/NonVoidThrowHelper.csproj diff --git a/src/coreclr/jit/morph.cpp b/src/coreclr/jit/morph.cpp index b3119206cdee35..eaf87f02da9c2c 100644 --- a/src/coreclr/jit/morph.cpp +++ b/src/coreclr/jit/morph.cpp @@ -9310,7 +9310,7 @@ GenTree* Compiler::fgMorphCall(GenTreeCall* call) // only for BBJ_RETURN blocks. // - if (!call->IsTailCall() && (call->TypeIs(TYP_VOID) || (call->gtFlags & GTF_EXCEPT))) + if (!call->IsTailCall()) { fgRemoveRestOfBlock = true; } @@ -14748,7 +14748,6 @@ GenTree* Compiler::fgMorphSmpOp(GenTree* tree, MorphAddrContext* mac) if (fgIsCommaThrow(op1, true)) { GenTree* throwNode = op1->AsOp()->gtOp1; - noway_assert(throwNode->gtType == TYP_VOID); JITDUMP("Removing [%06d] GT_JTRUE as the block now unconditionally throws an exception.\n", dspTreeID(tree)); diff --git a/src/tests/JIT/opt/ThrowHelper/NonVoidThrowHelper.cs b/src/tests/JIT/opt/ThrowHelper/NonVoidThrowHelper.cs new file mode 100644 index 00000000000000..f8ab2e74cbef1d --- /dev/null +++ b/src/tests/JIT/opt/ThrowHelper/NonVoidThrowHelper.cs @@ -0,0 +1,177 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +using System; +using System.Linq; +using System.Reflection; +using System.Runtime.CompilerServices; + +public class ProgramException : Exception {} + +public sealed class ProgramSubclass : Program +{ + public static readonly object s_Obj = new object(); +} + +public unsafe class Program +{ + private static int s_ReturnCode = 100; + + private Guid field; + + private static Program s_Instance = new (); + + private static Program GetClass() => throw new ProgramException(); + + private static Guid GetGuid() => throw new ProgramException(); + + private static IntPtr GetIntPtr() => throw new ProgramException(); + + private static int* GetPtr() => throw new ProgramException(); + + private static Span GetSpan() => throw new ProgramException(); + + private static int GetInt(object obj) => throw new ProgramException(); + + + [MethodImpl(MethodImplOptions.NoInlining)] + private static void DoWork() => s_ReturnCode++; + + private static void TestCond0() + { + if (GetClass() == default) + DoWork(); + } + + private static void TestCond1() + { + if (GetClass() is ProgramSubclass) + DoWork(); + } + + private static void TestCond2() + { + if (GetInt(ProgramSubclass.s_Obj) != 42) + DoWork(); + } + + private static void TestCond3() + { + if (GetClass() == s_Instance) + DoWork(); + } + + private static void TestCond4() + { + if (GetClass().field == Guid.NewGuid()) + DoWork(); + } + + private static void TestCond5() + { + if (GetGuid() == default) + DoWork(); + } + + private static void TestCond6() + { + if (GetIntPtr() == (IntPtr)42) + DoWork(); + } + + private static void TestCond7() + { + if (*GetPtr() == 42) + DoWork(); + } + + private static void TestCond8() + { + if (GetSpan()[4] == 42) + DoWork(); + } + + private static bool TestRet1() + { + return GetClass() == default; + } + + private static bool TestRet2() + { + return GetClass() == s_Instance; + } + + private static bool TestRet3() + { + return GetClass() is ProgramSubclass; + } + + private static bool TestRet4() + { + return GetInt(ProgramSubclass.s_Obj) == 42; + } + + private static bool TestRet5() + { + return GetClass().field == Guid.NewGuid(); + } + + private static bool TestRet6() + { + return GetGuid() == default; + } + + private static bool TestRet7() + { + return GetIntPtr() == (IntPtr)42; + } + + private static bool TestRet8() + { + return *GetPtr() == 42; + } + + private static bool TestRet9() + { + return GetSpan()[100] == 42; + } + + private static Program TestTailCall1() + { + return GetClass(); + } + + private static Guid TestTailCall2() + { + return GetGuid(); + } + + private static IntPtr TestTailCall3() + { + return GetIntPtr(); + } + + private static int* TestTailCall4() + { + return GetPtr(); + } + + public static int Main() + { + foreach (var method in typeof(Program) + .GetMethods(BindingFlags.Static | BindingFlags.NonPublic) + .Where(m => m.Name.StartsWith("Test"))) + { + try + { + method.Invoke(null, null); + } + catch (TargetInvocationException tie) when (tie.InnerException is ProgramException) + { + continue; + } + + s_ReturnCode++; + } + return s_ReturnCode; + } +} diff --git a/src/tests/JIT/opt/ThrowHelper/NonVoidThrowHelper.csproj b/src/tests/JIT/opt/ThrowHelper/NonVoidThrowHelper.csproj new file mode 100644 index 00000000000000..8199d384aac7f2 --- /dev/null +++ b/src/tests/JIT/opt/ThrowHelper/NonVoidThrowHelper.csproj @@ -0,0 +1,9 @@ + + + Exe + True + + + + + From ceee3ce2bdac97ec27086655f3f4558874d41564 Mon Sep 17 00:00:00 2001 From: Egor Bogatov Date: Thu, 25 Feb 2021 23:18:30 +0300 Subject: [PATCH 05/12] Update NonVoidThrowHelper.csproj --- src/tests/JIT/opt/ThrowHelper/NonVoidThrowHelper.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tests/JIT/opt/ThrowHelper/NonVoidThrowHelper.csproj b/src/tests/JIT/opt/ThrowHelper/NonVoidThrowHelper.csproj index 8199d384aac7f2..3430940509932f 100644 --- a/src/tests/JIT/opt/ThrowHelper/NonVoidThrowHelper.csproj +++ b/src/tests/JIT/opt/ThrowHelper/NonVoidThrowHelper.csproj @@ -2,6 +2,7 @@ Exe True + true From 49a7d84461f614231f1220c8b72272dbfdb19191 Mon Sep 17 00:00:00 2001 From: Egor Bogatov Date: Fri, 26 Feb 2021 12:45:54 +0300 Subject: [PATCH 06/12] Update NonVoidThrowHelper.cs --- src/tests/JIT/opt/ThrowHelper/NonVoidThrowHelper.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/tests/JIT/opt/ThrowHelper/NonVoidThrowHelper.cs b/src/tests/JIT/opt/ThrowHelper/NonVoidThrowHelper.cs index f8ab2e74cbef1d..c6b0e9e527f14b 100644 --- a/src/tests/JIT/opt/ThrowHelper/NonVoidThrowHelper.cs +++ b/src/tests/JIT/opt/ThrowHelper/NonVoidThrowHelper.cs @@ -165,9 +165,12 @@ public static int Main() { method.Invoke(null, null); } - catch (TargetInvocationException tie) when (tie.InnerException is ProgramException) + catch (TargetInvocationException tie) { - continue; + if (tie.InnerException is ProgramException) + { + continue; + } } s_ReturnCode++; From 8e9f5c273cf643d71318475f77a108c3dd405330 Mon Sep 17 00:00:00 2001 From: EgorBo Date: Fri, 26 Feb 2021 17:52:36 +0300 Subject: [PATCH 07/12] Disable the test for wasm --- src/tests/issues.targets | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/tests/issues.targets b/src/tests/issues.targets index d7a6bb99f80d5a..4586672c25ed1c 100644 --- a/src/tests/issues.targets +++ b/src/tests/issues.targets @@ -2660,6 +2660,9 @@ + + https://github.com/dotnet/runtime/issues/48819 + https://github.com/dotnet/runtime/issues/41193 From da2e1420384b9d589755f2db7a81a93fe2580689 Mon Sep 17 00:00:00 2001 From: Egor Bogatov Date: Wed, 3 Mar 2021 11:26:12 +0300 Subject: [PATCH 08/12] Update morph.cpp --- src/coreclr/jit/morph.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreclr/jit/morph.cpp b/src/coreclr/jit/morph.cpp index cea479a670631b..907eebeabb0bfa 100644 --- a/src/coreclr/jit/morph.cpp +++ b/src/coreclr/jit/morph.cpp @@ -9350,7 +9350,7 @@ GenTree* Compiler::fgMorphCall(GenTreeCall* call) // only for BBJ_RETURN blocks. // - if (!call->IsTailCall()) + if (!call->IsTailCall() && call->TypeGet() == TYP_VOID/* ci test */) { fgRemoveRestOfBlock = true; } From aff7e7672e79184055919a18bfe2fc9b5bc4443c Mon Sep 17 00:00:00 2001 From: Egor Bogatov Date: Thu, 4 Mar 2021 01:09:41 +0300 Subject: [PATCH 09/12] Update morph.cpp --- src/coreclr/jit/morph.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreclr/jit/morph.cpp b/src/coreclr/jit/morph.cpp index 907eebeabb0bfa..cea479a670631b 100644 --- a/src/coreclr/jit/morph.cpp +++ b/src/coreclr/jit/morph.cpp @@ -9350,7 +9350,7 @@ GenTree* Compiler::fgMorphCall(GenTreeCall* call) // only for BBJ_RETURN blocks. // - if (!call->IsTailCall() && call->TypeGet() == TYP_VOID/* ci test */) + if (!call->IsTailCall()) { fgRemoveRestOfBlock = true; } From 2d580d6b38aef85812d6080fe21aa9bf96b03823 Mon Sep 17 00:00:00 2001 From: EgorBo Date: Tue, 9 Mar 2021 14:03:43 +0300 Subject: [PATCH 10/12] ci test --- src/coreclr/jit/flowgraph.cpp | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/coreclr/jit/flowgraph.cpp b/src/coreclr/jit/flowgraph.cpp index 6699aee1c40e73..4930a7198c8b95 100644 --- a/src/coreclr/jit/flowgraph.cpp +++ b/src/coreclr/jit/flowgraph.cpp @@ -684,7 +684,29 @@ PhaseStatus Compiler::fgImport() bool Compiler::fgIsThrow(GenTree* tree) { - if (!tree->IsCall()) + if ((tree->gtOper != GT_CALL) || (tree->AsCall()->gtCallType != CT_HELPER)) + { + return false; + } + + // TODO-Throughput: Replace all these calls to eeFindHelper() with a table based lookup + + if ((tree->AsCall()->gtCallMethHnd == eeFindHelper(CORINFO_HELP_OVERFLOW)) || + (tree->AsCall()->gtCallMethHnd == eeFindHelper(CORINFO_HELP_VERIFICATION)) || + (tree->AsCall()->gtCallMethHnd == eeFindHelper(CORINFO_HELP_RNGCHKFAIL)) || + (tree->AsCall()->gtCallMethHnd == eeFindHelper(CORINFO_HELP_THROWDIVZERO)) || + (tree->AsCall()->gtCallMethHnd == eeFindHelper(CORINFO_HELP_THROWNULLREF)) || + (tree->AsCall()->gtCallMethHnd == eeFindHelper(CORINFO_HELP_THROW)) || + (tree->AsCall()->gtCallMethHnd == eeFindHelper(CORINFO_HELP_RETHROW)) || + (tree->AsCall()->gtCallMethHnd == eeFindHelper(CORINFO_HELP_THROW_TYPE_NOT_SUPPORTED)) || + (tree->AsCall()->gtCallMethHnd == eeFindHelper(CORINFO_HELP_THROW_PLATFORM_NOT_SUPPORTED))) + { + noway_assert(tree->gtFlags & GTF_CALL); + noway_assert(tree->gtFlags & GTF_EXCEPT); + return true; + } + + /*if (!tree->IsCall()) { return false; } @@ -699,7 +721,7 @@ bool Compiler::fgIsThrow(GenTree* tree) { noway_assert(call->gtFlags & GTF_EXCEPT); return true; - } + }*/ return false; } From 32c276ecf1159c2269713e466469e963e7d0a29d Mon Sep 17 00:00:00 2001 From: EgorBo Date: Tue, 9 Mar 2021 17:18:27 +0300 Subject: [PATCH 11/12] ci test2 --- src/coreclr/jit/flowgraph.cpp | 31 ++++++++++++------------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/src/coreclr/jit/flowgraph.cpp b/src/coreclr/jit/flowgraph.cpp index 4930a7198c8b95..1fb52ca7395fb8 100644 --- a/src/coreclr/jit/flowgraph.cpp +++ b/src/coreclr/jit/flowgraph.cpp @@ -684,13 +684,23 @@ PhaseStatus Compiler::fgImport() bool Compiler::fgIsThrow(GenTree* tree) { - if ((tree->gtOper != GT_CALL) || (tree->AsCall()->gtCallType != CT_HELPER)) + if (!tree->IsCall()) { return false; } - // TODO-Throughput: Replace all these calls to eeFindHelper() with a table based lookup + GenTreeCall* call = tree->AsCall(); + if (call->IsNoReturn()) + { + return true; + } + if ((tree->AsCall()->gtCallType != CT_HELPER)) + { + return false; + } + + // TODO-Throughput: Replace all these calls to eeFindHelper() with a table based lookup if ((tree->AsCall()->gtCallMethHnd == eeFindHelper(CORINFO_HELP_OVERFLOW)) || (tree->AsCall()->gtCallMethHnd == eeFindHelper(CORINFO_HELP_VERIFICATION)) || (tree->AsCall()->gtCallMethHnd == eeFindHelper(CORINFO_HELP_RNGCHKFAIL)) || @@ -705,23 +715,6 @@ bool Compiler::fgIsThrow(GenTree* tree) noway_assert(tree->gtFlags & GTF_EXCEPT); return true; } - - /*if (!tree->IsCall()) - { - return false; - } - - GenTreeCall* call = tree->AsCall(); - if (call->IsNoReturn()) - { - return true; - } - - if ((call->gtCallType == CT_HELPER) && s_helperCallProperties.AlwaysThrow(eeGetHelperNum(call->gtCallMethHnd))) - { - noway_assert(call->gtFlags & GTF_EXCEPT); - return true; - }*/ return false; } From a78c0af34e8fb165207bcd87011a6f0de2b3cc7e Mon Sep 17 00:00:00 2001 From: EgorBo Date: Tue, 9 Mar 2021 19:13:31 +0300 Subject: [PATCH 12/12] Clean up --- src/coreclr/jit/flowgraph.cpp | 25 ++----------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/src/coreclr/jit/flowgraph.cpp b/src/coreclr/jit/flowgraph.cpp index 1fb52ca7395fb8..9fb409929044df 100644 --- a/src/coreclr/jit/flowgraph.cpp +++ b/src/coreclr/jit/flowgraph.cpp @@ -688,31 +688,10 @@ bool Compiler::fgIsThrow(GenTree* tree) { return false; } - GenTreeCall* call = tree->AsCall(); - if (call->IsNoReturn()) - { - return true; - } - - if ((tree->AsCall()->gtCallType != CT_HELPER)) - { - return false; - } - - // TODO-Throughput: Replace all these calls to eeFindHelper() with a table based lookup - if ((tree->AsCall()->gtCallMethHnd == eeFindHelper(CORINFO_HELP_OVERFLOW)) || - (tree->AsCall()->gtCallMethHnd == eeFindHelper(CORINFO_HELP_VERIFICATION)) || - (tree->AsCall()->gtCallMethHnd == eeFindHelper(CORINFO_HELP_RNGCHKFAIL)) || - (tree->AsCall()->gtCallMethHnd == eeFindHelper(CORINFO_HELP_THROWDIVZERO)) || - (tree->AsCall()->gtCallMethHnd == eeFindHelper(CORINFO_HELP_THROWNULLREF)) || - (tree->AsCall()->gtCallMethHnd == eeFindHelper(CORINFO_HELP_THROW)) || - (tree->AsCall()->gtCallMethHnd == eeFindHelper(CORINFO_HELP_RETHROW)) || - (tree->AsCall()->gtCallMethHnd == eeFindHelper(CORINFO_HELP_THROW_TYPE_NOT_SUPPORTED)) || - (tree->AsCall()->gtCallMethHnd == eeFindHelper(CORINFO_HELP_THROW_PLATFORM_NOT_SUPPORTED))) + if ((call->gtCallType == CT_HELPER) && s_helperCallProperties.AlwaysThrow(eeGetHelperNum(call->gtCallMethHnd))) { - noway_assert(tree->gtFlags & GTF_CALL); - noway_assert(tree->gtFlags & GTF_EXCEPT); + noway_assert(call->gtFlags & GTF_EXCEPT); return true; } return false;