diff --git a/src/hotspot/share/opto/callGenerator.cpp b/src/hotspot/share/opto/callGenerator.cpp index bb0e50331be..e7c80221ce6 100644 --- a/src/hotspot/share/opto/callGenerator.cpp +++ b/src/hotspot/share/opto/callGenerator.cpp @@ -440,26 +440,25 @@ CallGenerator* CallGenerator::for_mh_late_inline(ciMethod* caller, ciMethod* cal class LateInlineVectorCallGenerator : public LateInlineCallGenerator { protected: bool _use_fallback_generator; - CallGenerator* _inline_cg; + CallGenerator* _inline_cg2; public: LateInlineVectorCallGenerator(ciMethod* method, CallGenerator* intrinsic_cg, CallGenerator* inline_cg) : - LateInlineCallGenerator(method, intrinsic_cg) , _inline_cg(inline_cg) { + LateInlineCallGenerator(method, intrinsic_cg) , _inline_cg2(inline_cg) { _use_fallback_generator = false; } - CallGenerator* inline_cg2() const { return _inline_cg; } - bool inline_fallback(); - bool is_fallback_generation() { - return _use_fallback_generator; + virtual CallGenerator* inline_cg() const { + return _use_fallback_generator ? _inline_cg2 : _inline_cg; } + virtual bool inline_fallback() const; virtual bool is_vector_late_inline() const { return true; } virtual void enable_fallback_generation() { _use_fallback_generator = true; } }; -bool LateInlineVectorCallGenerator::inline_fallback() { +bool LateInlineVectorCallGenerator::inline_fallback() const { switch (method()->intrinsic_id()) { case vmIntrinsics::_VectorSlice: return true; default : return false; @@ -705,28 +704,8 @@ void CallGenerator::do_late_inline_helper() { C->set_default_node_notes(entry_nn); } - CallGenerator* cg = inline_cg(); - LateInlineVectorCallGenerator* late_inline_vec_cg = nullptr; - if (is_vector_late_inline()) { - late_inline_vec_cg = static_cast(this); - if (late_inline_vec_cg->is_fallback_generation() && late_inline_vec_cg->inline_fallback()) { - cg = late_inline_vec_cg->inline_cg2(); - } - } - // Now perform the inlining using the synthesized JVMState - JVMState* new_jvms = cg->generate(jvms); - - // Bookkeep call generator for lazy inlining fallback implementation in case of - // intrinsification failure. - if (late_inline_vec_cg != nullptr && !late_inline_vec_cg->is_fallback_generation()) { - if (new_jvms == nullptr) { - C->vector_late_inlines()->append_if_missing(this); - } else { - C->vector_late_inlines()->remove_if_existing(this); - } - } - + JVMState* new_jvms = inline_cg()->generate(jvms); if (new_jvms == nullptr) return; // no change if (C->failing()) return; diff --git a/src/hotspot/share/opto/callGenerator.hpp b/src/hotspot/share/opto/callGenerator.hpp index 45b0fea719b..13609931d12 100644 --- a/src/hotspot/share/opto/callGenerator.hpp +++ b/src/hotspot/share/opto/callGenerator.hpp @@ -76,6 +76,7 @@ class CallGenerator : public ArenaObj { virtual bool is_mh_late_inline() const { return false; } virtual bool is_string_late_inline() const { return false; } virtual bool is_vector_late_inline() const { return false; } + virtual bool inline_fallback() const { return false; } virtual void enable_fallback_generation() { return; } virtual bool is_boxing_late_inline() const { return false; } virtual bool is_vector_reboxing_late_inline() const { return false; } diff --git a/src/hotspot/share/opto/compile.cpp b/src/hotspot/share/opto/compile.cpp index 25583d79231..13d9398e7d7 100644 --- a/src/hotspot/share/opto/compile.cpp +++ b/src/hotspot/share/opto/compile.cpp @@ -2016,8 +2016,10 @@ void Compile::inline_vector_fallback(PhaseIterGVN& igvn) { while (_vector_late_inlines.length() > 0) { CallGenerator* cg = _vector_late_inlines.pop(); assert(cg->is_vector_late_inline(), ""); - cg->enable_fallback_generation(); - cg->do_late_inline(); + if (cg->inline_fallback()) { + cg->enable_fallback_generation(); + cg->do_late_inline(); + } if (failing()) return; } _vector_late_inlines.trunc_to(0); @@ -2116,6 +2118,9 @@ bool Compile::inline_incrementally_one() { } else if (inlining_progress()) { _late_inlines_pos = i+1; // restore the position in case new elements were inserted print_method(PHASE_INCREMENTAL_INLINE_STEP, 3, cg->call_node()); + if (cg->is_vector_late_inline()) { + C->vector_late_inlines()->remove_if_existing(cg); + } break; // process one call site at a time } else { bool is_scheduled_for_igvn_after = C->igvn_worklist()->member(cg->call_node()); @@ -2126,6 +2131,9 @@ bool Compile::inline_incrementally_one() { // Ensure call node has not disappeared from IGVN worklist during a failed inlining attempt assert(!is_scheduled_for_igvn_before || is_scheduled_for_igvn_after, "call node removed from IGVN list during inlining pass"); cg->call_node()->set_generator(cg); + if (cg->is_vector_late_inline()) { + C->vector_late_inlines()->append_if_missing(cg); + } } } } else {