# HG changeset patch # User mdoerr # Date 1588761981 -7200 # Wed May 06 12:46:21 2020 +0200 # Node ID 5b53eae4a5183faad4334c66ad5755e90814a659 # Parent 1baa7e5f2443e20e5aace62166c431cb890a925f 8235673: [C1, C2] Split inlining control flags Reviewed-by: neliasso diff --git a/src/hotspot/cpu/aarch64/c1_globals_aarch64.hpp b/src/hotspot/cpu/aarch64/c1_globals_aarch64.hpp --- a/src/hotspot/cpu/aarch64/c1_globals_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/c1_globals_aarch64.hpp @@ -44,7 +44,6 @@ define_pd_global(intx, CompileThreshold, 1500 ); define_pd_global(intx, OnStackReplacePercentage, 933 ); -define_pd_global(intx, FreqInlineSize, 325 ); define_pd_global(intx, NewSizeThreadIncrease, 4*K ); define_pd_global(intx, InitialCodeCacheSize, 160*K); define_pd_global(intx, ReservedCodeCacheSize, 32*M ); diff --git a/src/hotspot/cpu/arm/c1_globals_arm.hpp b/src/hotspot/cpu/arm/c1_globals_arm.hpp --- a/src/hotspot/cpu/arm/c1_globals_arm.hpp +++ b/src/hotspot/cpu/arm/c1_globals_arm.hpp @@ -45,7 +45,6 @@ define_pd_global(intx, CompileThreshold, 1500 ); define_pd_global(intx, OnStackReplacePercentage, 933 ); -define_pd_global(intx, FreqInlineSize, 325 ); define_pd_global(size_t, NewSizeThreadIncrease, 4*K ); define_pd_global(size_t, InitialCodeCacheSize, 160*K); define_pd_global(size_t, ReservedCodeCacheSize, 32*M ); diff --git a/src/hotspot/cpu/ppc/c1_globals_ppc.hpp b/src/hotspot/cpu/ppc/c1_globals_ppc.hpp --- a/src/hotspot/cpu/ppc/c1_globals_ppc.hpp +++ b/src/hotspot/cpu/ppc/c1_globals_ppc.hpp @@ -45,7 +45,6 @@ define_pd_global(intx, OnStackReplacePercentage, 1400); define_pd_global(bool, UseTLAB, true); define_pd_global(bool, ProfileInterpreter, false); -define_pd_global(intx, FreqInlineSize, 325 ); define_pd_global(bool, ResizeTLAB, true); define_pd_global(uintx, ReservedCodeCacheSize, 32*M); define_pd_global(uintx, NonProfiledCodeHeapSize, 13*M ); diff --git a/src/hotspot/cpu/s390/c1_globals_s390.hpp b/src/hotspot/cpu/s390/c1_globals_s390.hpp --- a/src/hotspot/cpu/s390/c1_globals_s390.hpp +++ b/src/hotspot/cpu/s390/c1_globals_s390.hpp @@ -46,7 +46,6 @@ define_pd_global(intx, OnStackReplacePercentage, 1400); define_pd_global(bool, UseTLAB, true); define_pd_global(bool, ProfileInterpreter, false); -define_pd_global(intx, FreqInlineSize, 325); define_pd_global(bool, ResizeTLAB, true); define_pd_global(uintx, ReservedCodeCacheSize, 32*M); define_pd_global(uintx, NonProfiledCodeHeapSize, 13*M); diff --git a/src/hotspot/cpu/sparc/c1_globals_sparc.hpp b/src/hotspot/cpu/sparc/c1_globals_sparc.hpp --- a/src/hotspot/cpu/sparc/c1_globals_sparc.hpp +++ b/src/hotspot/cpu/sparc/c1_globals_sparc.hpp @@ -44,7 +44,6 @@ define_pd_global(intx, OnStackReplacePercentage, 1400 ); define_pd_global(bool, UseTLAB, true ); define_pd_global(bool, ProfileInterpreter, false); -define_pd_global(intx, FreqInlineSize, 325 ); define_pd_global(bool, ResizeTLAB, true ); define_pd_global(uintx, ReservedCodeCacheSize, 32*M ); define_pd_global(uintx, NonProfiledCodeHeapSize, 13*M ); diff --git a/src/hotspot/cpu/x86/c1_globals_x86.hpp b/src/hotspot/cpu/x86/c1_globals_x86.hpp --- a/src/hotspot/cpu/x86/c1_globals_x86.hpp +++ b/src/hotspot/cpu/x86/c1_globals_x86.hpp @@ -43,7 +43,6 @@ define_pd_global(intx, CompileThreshold, 1500 ); define_pd_global(intx, OnStackReplacePercentage, 933 ); -define_pd_global(intx, FreqInlineSize, 325 ); define_pd_global(size_t, NewSizeThreadIncrease, 4*K ); define_pd_global(uintx, InitialCodeCacheSize, 160*K); define_pd_global(uintx, ReservedCodeCacheSize, 32*M ); diff --git a/src/hotspot/share/c1/c1_GraphBuilder.cpp b/src/hotspot/share/c1/c1_GraphBuilder.cpp --- a/src/hotspot/share/c1/c1_GraphBuilder.cpp +++ b/src/hotspot/share/c1/c1_GraphBuilder.cpp @@ -700,10 +700,10 @@ if (parent != NULL) { _max_inline_size = (intx) ((float) NestedInliningSizeRatio * (float) parent->max_inline_size() / 100.0f); } else { - _max_inline_size = MaxInlineSize; + _max_inline_size = C1MaxInlineSize; } - if (_max_inline_size < MaxTrivialSize) { - _max_inline_size = MaxTrivialSize; + if (_max_inline_size < C1MaxTrivialSize) { + _max_inline_size = C1MaxTrivialSize; } } @@ -3816,8 +3816,8 @@ // now perform tests that are based on flag settings bool inlinee_by_directive = compilation()->directive()->should_inline(callee); if (callee->force_inline() || inlinee_by_directive) { - if (inline_level() > MaxForceInlineLevel ) INLINE_BAILOUT("MaxForceInlineLevel"); - if (recursive_inline_level(callee) > MaxRecursiveInlineLevel) INLINE_BAILOUT("recursive inlining too deep"); + if (inline_level() > MaxForceInlineLevel ) INLINE_BAILOUT("MaxForceInlineLevel"); + if (recursive_inline_level(callee) > C1MaxRecursiveInlineLevel) INLINE_BAILOUT("recursive inlining too deep"); const char* msg = ""; if (callee->force_inline()) msg = "force inline by annotation"; @@ -3825,9 +3825,15 @@ print_inlining(callee, msg); } else { // use heuristic controls on inlining - if (inline_level() > MaxInlineLevel ) INLINE_BAILOUT("inlining too deep"); - if (recursive_inline_level(callee) > MaxRecursiveInlineLevel) INLINE_BAILOUT("recursive inlining too deep"); + if (inline_level() > C1MaxInlineLevel ) INLINE_BAILOUT("inlining too deep"); + int callee_recursive_level = recursive_inline_level(callee); + if (callee_recursive_level > C1MaxRecursiveInlineLevel ) INLINE_BAILOUT("recursive inlining too deep"); if (callee->code_size_for_inlining() > max_inline_size() ) INLINE_BAILOUT("callee is too large"); + // Additional condition to limit stack usage for non-recursive calls. + if ((callee_recursive_level == 0) && + (callee->max_stack() + callee->max_locals() - callee->size_of_parameters() > C1InlineStackLimit)) { + INLINE_BAILOUT("callee uses too much stack"); + } // don't inline throwable methods unless the inlining tree is rooted in a throwable class if (callee->name() == ciSymbol::object_initializer_name() && diff --git a/src/hotspot/share/c1/c1_globals.hpp b/src/hotspot/share/c1/c1_globals.hpp --- a/src/hotspot/share/c1/c1_globals.hpp +++ b/src/hotspot/share/c1/c1_globals.hpp @@ -170,6 +170,28 @@ develop(bool, UseTableRanges, true, \ "Faster versions of lookup table using ranges") \ \ + product(intx, C1MaxInlineSize, 35, \ + "The maximum bytecode size of a method to be inlined by C1") \ + range(0, max_jint) \ + \ + product(intx, C1MaxTrivialSize, 6, \ + "The maximum bytecode size of a trivial method to be inlined by " \ + "C1") \ + range(0, max_jint) \ + \ + product(intx, C1MaxInlineLevel, 9, \ + "The maximum number of nested calls that are inlined by C1") \ + range(0, max_jint) \ + \ + product(intx, C1MaxRecursiveInlineLevel, 1, \ + "maximum number of nested recursive calls that are inlined by C1")\ + range(0, max_jint) \ + \ + product(intx, C1InlineStackLimit, 10, \ + "inlining only allowed for methods which don't exceed this " \ + "number of expression stack and local slots") \ + range(0, max_jint) \ + \ develop(intx, NestedInliningSizeRatio, 90, \ "Percentage of prev. allowed inline size in recursive inlining") \ range(0, 100) \ diff --git a/src/hotspot/share/compiler/compilerDefinitions.cpp b/src/hotspot/share/compiler/compilerDefinitions.cpp --- a/src/hotspot/share/compiler/compilerDefinitions.cpp +++ b/src/hotspot/share/compiler/compilerDefinitions.cpp @@ -278,6 +278,13 @@ } #endif // INCLUDE_AOT } + + // Reduce stack usage due to inlining of methods which require much stack. + // (High tier compiler can inline better based on profiling information.) + if (FLAG_IS_DEFAULT(C1InlineStackLimit) && + TieredStopAtLevel == CompLevel_full_optimization && !CompilationModeFlag::quick_only()) { + FLAG_SET_DEFAULT(C1InlineStackLimit, 5); + } } #endif // TIERED diff --git a/src/hotspot/share/compiler/compiler_globals.hpp b/src/hotspot/share/compiler/compiler_globals.hpp --- a/src/hotspot/share/compiler/compiler_globals.hpp +++ b/src/hotspot/share/compiler/compiler_globals.hpp @@ -52,7 +52,6 @@ define_pd_global(intx, OnStackReplacePercentage, 0); define_pd_global(bool, ResizeTLAB, false); -define_pd_global(intx, FreqInlineSize, 0); define_pd_global(size_t, NewSizeThreadIncrease, 4*K); define_pd_global(bool, InlineClassNatives, true); define_pd_global(bool, InlineUnsafeOps, true); diff --git a/src/hotspot/share/opto/c2_globals.hpp b/src/hotspot/share/opto/c2_globals.hpp --- a/src/hotspot/share/opto/c2_globals.hpp +++ b/src/hotspot/share/opto/c2_globals.hpp @@ -684,6 +684,35 @@ develop(bool, VerifyAliases, false, \ "perform extra checks on the results of alias analysis") \ \ + product(intx, MaxInlineLevel, 15, \ + "maximum number of nested calls that are inlined by high tier " \ + "compiler") \ + range(0, max_jint) \ + \ + product(intx, MaxRecursiveInlineLevel, 1, \ + "maximum number of nested recursive calls that are inlined by " \ + "high tier compiler") \ + range(0, max_jint) \ + \ + product_pd(intx, InlineSmallCode, \ + "Only inline already compiled methods if their code size is " \ + "less than this") \ + range(0, max_jint) \ + \ + product(intx, MaxInlineSize, 35, \ + "The maximum bytecode size of a method to be inlined by high " \ + "tier compiler") \ + range(0, max_jint) \ + \ + product_pd(intx, FreqInlineSize, \ + "The maximum bytecode size of a frequent method to be inlined") \ + range(0, max_jint) \ + \ + product(intx, MaxTrivialSize, 6, \ + "The maximum bytecode size of a trivial method to be inlined by " \ + "high tier compiler") \ + range(0, max_jint) \ + \ product(bool, IncrementalInline, true, \ "do post parse inlining") \ \ diff --git a/src/hotspot/share/runtime/globals.hpp b/src/hotspot/share/runtime/globals.hpp --- a/src/hotspot/share/runtime/globals.hpp +++ b/src/hotspot/share/runtime/globals.hpp @@ -1453,36 +1453,11 @@ notproduct(intx, MaxSubklassPrintSize, 4, \ "maximum number of subklasses to print when printing klass") \ \ - product(intx, MaxInlineLevel, 15, \ - "maximum number of nested calls that are inlined") \ - range(0, max_jint) \ - \ - product(intx, MaxRecursiveInlineLevel, 1, \ - "maximum number of nested recursive calls that are inlined") \ - range(0, max_jint) \ - \ develop(intx, MaxForceInlineLevel, 100, \ "maximum number of nested calls that are forced for inlining " \ "(using CompileCommand or marked w/ @ForceInline)") \ range(0, max_jint) \ \ - product_pd(intx, InlineSmallCode, \ - "Only inline already compiled methods if their code size is " \ - "less than this") \ - range(0, max_jint) \ - \ - product(intx, MaxInlineSize, 35, \ - "The maximum bytecode size of a method to be inlined") \ - range(0, max_jint) \ - \ - product_pd(intx, FreqInlineSize, \ - "The maximum bytecode size of a frequent method to be inlined") \ - range(0, max_jint) \ - \ - product(intx, MaxTrivialSize, 6, \ - "The maximum bytecode size of a trivial method to be inlined") \ - range(0, max_jint) \ - \ product(intx, MinInliningThreshold, 250, \ "The minimum invocation count a method needs to have to be " \ "inlined") \