1 /*
  2  * Copyright (c) 2006, 2025, Oracle and/or its affiliates. All rights reserved.
  3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  4  *
  5  * This code is free software; you can redistribute it and/or modify it
  6  * under the terms of the GNU General Public License version 2 only, as
  7  * published by the Free Software Foundation.
  8  *
  9  * This code is distributed in the hope that it will be useful, but WITHOUT
 10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 12  * version 2 for more details (a copy is included in the LICENSE file that
 13  * accompanied this code).
 14  *
 15  * You should have received a copy of the GNU General Public License version
 16  * 2 along with this work; if not, write to the Free Software Foundation,
 17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 18  *
 19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 20  * or visit www.oracle.com if you need additional information or have any
 21  * questions.
 22  *
 23  */
 24 
 25 #include "memory/allocation.inline.hpp"
 26 #include "opto/castnode.hpp"
 27 #include "opto/cfgnode.hpp"
 28 #include "opto/connode.hpp"
 29 #include "opto/convertnode.hpp"
 30 #include "opto/loopnode.hpp"
 31 #include "opto/opaquenode.hpp"
 32 #include "opto/predicates.hpp"
 33 #include "opto/rootnode.hpp"
 34 
 35 // Multiversioning:
 36 // A loop is cloned, and a selector If decides which loop is taken at run-time: the true-path-loop (original) or the
 37 // false-path-loop (cloned).
 38 //
 39 // Use-cases:
 40 // - Speculative compilation:
 41 //   The selector If checks some assumptions which allow stronger optimization in the true-path-loop. If the assumptions
 42 //   do not hold, we can still execute in the false-path-loop, although with fewer optimizations.
 43 //   See: PhaseIdealLoop::maybe_multiversion_for_auto_vectorization_runtime_checks
 44 //        PhaseIdealLoop::create_new_if_for_multiversion
 45 //
 46 // - Unswitching:
 47 //   The selector If has the same (loop invariant) condition as some unswitching candidate If inside the loop. This
 48 //   allows us to constant-fold the unswitching candidate If to true in the true-path-loop and to false in the
 49 //   false-path-loop, thus eliminating the unswitching candidate If from the loop.
 50 //
 51 //
 52 // Loop Unswitching is a loop optimization to move an invariant, non-loop-exiting test in the loop body before the loop.
 53 // Such a test is either always true or always false in all loop iterations and could therefore only be executed once.
 54 // To achieve that, we duplicate the loop and change the original and cloned loop as follows:
 55 // - Original loop -> true-path-loop:
 56 //        The true-path of the invariant, non-loop-exiting test in the original loop
 57 //        is kept while the false-path is killed. We call this unswitched loop version
 58 //        the true-path-loop.
 59 // - Cloned loop -> false-path-loop:
 60 //        The false-path of the invariant, non-loop-exiting test in the cloned loop
 61 //        is kept while the true-path is killed. We call this unswitched loop version
 62 //        the false-path loop.
 63 //
 64 // The invariant, non-loop-exiting test can now be moved before both loops (to only execute it once) and turned into a
 65 // loop selector If node to select at runtime which unswitched loop version should be executed.
 66 // - Loop selector true?  Execute the true-path-loop.
 67 // - Loop selector false? Execute the false-path-loop.
 68 //
 69 // Note that even though an invariant test that exits the loop could also be optimized with Loop Unswitching, it is more
 70 // efficient to simply peel the loop which achieves the same result in a simpler manner (also see policy_peeling()).
 71 //
 72 // The following graphs summarizes the Loop Unswitching optimization.
 73 // We start with the original loop:
 74 //
 75 //                       [Predicates]
 76 //                            |
 77 //                       Original Loop
 78 //                         stmt1
 79 //                         if (invariant-test)
 80 //                           if-path
 81 //                         else
 82 //                           else-path
 83 //                         stmt2
 84 //                       Endloop
 85 //
 86 //
 87 // which is unswitched into a true-path-loop and a false-path-loop together with a loop selector:
 88 //
 89 //
 90 //            [Initialized Assertion Predicates]
 91 //                            |
 92 //                 loop selector If (invariant-test)
 93 //                    /                   \
 94 //                true?                  false?
 95 //                /                         \
 96 //    [Cloned Parse Predicates]         [Cloned Parse Predicates]
 97 //    [Cloned Template                  [Cloned Template
 98 //     Assertion Predicates]             Assertion Predicates]
 99 //          |                                  |
100 //    True-Path-Loop                    False-Path-Loop
101 //      cloned stmt1                      cloned stmt1
102 //      cloned if-path                    cloned else-path
103 //      cloned stmt2                      cloned stmt2
104 //    Endloop                           Endloop
105 
106 
107 // Return true if the loop should be unswitched or false otherwise.
108 bool IdealLoopTree::policy_unswitching(PhaseIdealLoop* phase) const {
109   if (!LoopUnswitching) {
110     return false;
111   }
112   if (!_head->is_Loop()) {
113     return false;
114   }
115 
116   // If nodes are depleted, some transform has miscalculated its needs.
117   assert(!phase->exceeding_node_budget(), "sanity");
118 
119   // check for vectorized loops, any unswitching was already applied
120   if (_head->is_CountedLoop() && _head->as_CountedLoop()->is_unroll_only()) {
121     return false;
122   }
123 
124   LoopNode* head = _head->as_Loop();
125   if (head->unswitch_count() + 1 > head->unswitch_max()) {
126     return false;
127   }
128   if (phase->find_unswitch_candidate(this) == nullptr) {
129     return false;
130   }
131 
132   // Too speculative if running low on nodes.
133   return phase->may_require_nodes(est_loop_clone_sz(2));
134 }
135 
136 // Find an invariant test in the loop body that does not exit the loop. If multiple tests are found, we pick the first
137 // one in the loop body. Return the "unswitch candidate" If to apply Loop Unswitching on.
138 IfNode* PhaseIdealLoop::find_unswitch_candidate(const IdealLoopTree* loop) const {
139   LoopNode* head = loop->_head->as_Loop();
140   IfNode* unswitch_candidate = nullptr;
141   Node* n = head->in(LoopNode::LoopBackControl);
142   while (n != head) {
143     Node* n_dom = idom(n);
144     if (n->is_Region()) {
145       if (n_dom->is_If()) {
146         IfNode* iff = n_dom->as_If();
147         if (iff->in(1)->is_Bool()) {
148           BoolNode* bol = iff->in(1)->as_Bool();
149           if (bol->in(1)->is_Cmp()) {
150             // If condition is invariant and not a loop exit,
151             // then found reason to unswitch.
152             if (loop->is_invariant(bol) && !loop->is_loop_exit(iff)) {
153               assert(iff->Opcode() == Op_If || iff->is_RangeCheck() || iff->is_BaseCountedLoopEnd(), "valid ifs");
154               unswitch_candidate = iff;
155             }
156           }
157         }
158       }
159     }
160     n = n_dom;
161   }
162   return unswitch_candidate;
163 }
164 
165 // LoopSelector is used for loop multiversioning and unswitching. This class creates an If node (i.e. loop selector)
166 // that selects if the true-path-loop or the false-path-loop should be executed at runtime.
167 class LoopSelector : public StackObj {
168   // Cached fields for construction.
169   PhaseIdealLoop* const _phase;
170   IdealLoopTree* const _outer_loop;
171   Node* const _original_loop_entry;
172   const uint _dom_depth; // of original_loop_entry
173 
174   // Constructed selector if with its projections.
175   IfNode* const _selector;
176   IfTrueNode* const _true_path_loop_proj;
177   IfFalseNode* const _false_path_loop_proj;
178 
179   enum PathToLoop { TRUE_PATH, FALSE_PATH };
180 
181  public:
182   // For multiversioning: create a new selector (multiversion_if) from a bol condition.
183   LoopSelector(IdealLoopTree* loop, Node* bol, float prob, float fcnt)
184       : _phase(loop->_phase),
185         _outer_loop(loop->skip_strip_mined()->_parent),
186         _original_loop_entry(loop->_head->as_Loop()->skip_strip_mined()->in(LoopNode::EntryControl)),
187         _dom_depth(_phase->dom_depth(_original_loop_entry)),
188         _selector(create_multiversioning_if(bol, prob, fcnt)), // multiversioning
189         _true_path_loop_proj(create_proj_to_loop(TRUE_PATH)->as_IfTrue()),
190         _false_path_loop_proj(create_proj_to_loop(FALSE_PATH)->as_IfFalse()) {
191   }
192 
193   // For unswitching: create an unswitching if before the loop, from a pre-existing
194   //                  unswitching_candidate inside the loop.
195   LoopSelector(IdealLoopTree* loop, IfNode* unswitch_candidate)
196       : _phase(loop->_phase),
197         _outer_loop(loop->skip_strip_mined()->_parent),
198         _original_loop_entry(loop->_head->as_Loop()->skip_strip_mined()->in(LoopNode::EntryControl)),
199         _dom_depth(_phase->dom_depth(_original_loop_entry)),
200         _selector(create_unswitching_if(unswitch_candidate)), // unswitching
201         _true_path_loop_proj(create_proj_to_loop(TRUE_PATH)->as_IfTrue()),
202         _false_path_loop_proj(create_proj_to_loop(FALSE_PATH)->as_IfFalse()) {
203   }
204   NONCOPYABLE(LoopSelector);
205 
206   IfNode* create_multiversioning_if(Node* bol, float prob, float fcnt) {
207     _phase->igvn().rehash_node_delayed(_original_loop_entry);
208     IfNode* selector_if = new IfNode(_original_loop_entry, bol, prob, fcnt);
209     _phase->register_node(selector_if, _outer_loop, _original_loop_entry, _dom_depth);
210     return selector_if;
211   }
212 
213   IfNode* create_unswitching_if(IfNode* unswitch_candidate) {
214     _phase->igvn().rehash_node_delayed(_original_loop_entry);
215     BoolNode* unswitch_candidate_bool = unswitch_candidate->in(1)->as_Bool();
216     IfNode* selector_if = IfNode::make_with_same_profile(unswitch_candidate, _original_loop_entry,
217                                                          unswitch_candidate_bool);
218     _phase->register_node(selector_if, _outer_loop, _original_loop_entry, _dom_depth);
219     return selector_if;
220   }
221 
222  private:
223   IfProjNode* create_proj_to_loop(const PathToLoop path_to_loop) {
224     IfProjNode* proj_to_loop;
225     if (path_to_loop == TRUE_PATH) {
226       proj_to_loop = new IfTrueNode(_selector);
227     } else {
228       proj_to_loop = new IfFalseNode(_selector);
229     }
230     _phase->register_node(proj_to_loop, _outer_loop, _selector, _dom_depth);
231     return proj_to_loop;
232   }
233 
234  public:
235   IfNode* selector() const {
236     return _selector;
237   }
238 
239   IfTrueNode* true_path_loop_proj() const {
240     return _true_path_loop_proj;
241   }
242 
243   IfFalseNode* false_path_loop_proj() const {
244     return _false_path_loop_proj;
245   }
246 };
247 
248 // This class creates an If node (i.e. loop selector) that selects if the true-path-loop or the false-path-loop should be
249 // executed at runtime. This is done by finding an invariant and non-loop-exiting unswitch candidate If node (guaranteed
250 // to exist at this point) to perform Loop Unswitching on.
251 class UnswitchedLoopSelector : public StackObj {
252   IfNode* const _unswitch_candidate;
253   const LoopSelector _loop_selector;
254 
255  public:
256   UnswitchedLoopSelector(IdealLoopTree* loop)
257       : _unswitch_candidate(find_unswitch_candidate(loop)),
258         _loop_selector(loop, _unswitch_candidate) {}
259   NONCOPYABLE(UnswitchedLoopSelector);
260 
261  private:
262   static IfNode* find_unswitch_candidate(IdealLoopTree* loop) {
263     IfNode* unswitch_candidate = loop->_phase->find_unswitch_candidate(loop);
264     assert(unswitch_candidate != nullptr, "guaranteed to exist by policy_unswitching");
265     assert(loop->_phase->is_member(loop, unswitch_candidate), "must be inside original loop");
266     return unswitch_candidate;
267   }
268 
269  public:
270   IfNode* unswitch_candidate() const {
271     return _unswitch_candidate;
272   }
273 
274   const LoopSelector& loop_selector() const {
275     return _loop_selector;
276   }
277 };
278 
279 // Class to unswitch the original loop and create Predicates at the new unswitched loop versions. The newly cloned loop
280 // becomes the false-path-loop while original loop becomes the true-path-loop.
281 class OriginalLoop : public StackObj {
282   LoopNode* const _loop_head;
283   LoopNode* const _outer_loop_head; // OuterStripMinedLoopNode if loop strip mined, else just the loop head.
284   IdealLoopTree* const _loop;
285   Node_List& _old_new;
286   PhaseIdealLoop* const _phase;
287 
288  public:
289   OriginalLoop(IdealLoopTree* loop, Node_List& old_new)
290       : _loop_head(loop->_head->as_Loop()),
291         _outer_loop_head(loop->_head->as_Loop()->skip_strip_mined()),
292         _loop(loop),
293         _old_new(old_new),
294         _phase(loop->_phase) {}
295   NONCOPYABLE(OriginalLoop);
296 
297   // Unswitch the original loop on the invariant loop selector by creating a true-path-loop and a false-path-loop.
298   // Remove the unswitch candidate If from both unswitched loop versions which are now covered by the loop selector If.
299   void unswitch(const UnswitchedLoopSelector& unswitched_loop_selector) {
300     multiversion(unswitched_loop_selector.loop_selector());
301     remove_unswitch_candidate_from_loops(unswitched_loop_selector);
302   }
303 
304   // Multiversion the original loop. The loop selector if selects between the original loop (true-path-loop), and
305   // a copy of it (false-path-loop).
306   void multiversion(const LoopSelector& loop_selector) {
307     const uint first_false_path_loop_node_index = _phase->C->unique();
308     clone_loop(loop_selector);
309 
310     move_parse_and_template_assertion_predicates_to_unswitched_loops(loop_selector,
311                                                                      first_false_path_loop_node_index);
312     DEBUG_ONLY(verify_loop_versions(_loop->_head->as_Loop(), loop_selector);)
313 
314     _phase->recompute_dom_depth();
315   }
316 
317  private:
318   void clone_loop(const LoopSelector& loop_selector) {
319     _phase->clone_loop(_loop, _old_new, _phase->dom_depth(_outer_loop_head),
320                        PhaseIdealLoop::CloneIncludesStripMined, loop_selector.selector());
321     fix_loop_entries(loop_selector);
322   }
323 
324   void fix_loop_entries(const LoopSelector& loop_selector) const {
325     _phase->replace_loop_entry(_outer_loop_head, loop_selector.true_path_loop_proj());
326     LoopNode* false_path_loop_strip_mined_head = old_to_new(_outer_loop_head)->as_Loop();
327     _phase->replace_loop_entry(false_path_loop_strip_mined_head,
328                                loop_selector.false_path_loop_proj());
329   }
330 
331   // Moves the Parse And Template Assertion Predicates to the true and false path loop. They are inserted between the
332   // loop heads and the loop selector If projections. The old Parse and Template Assertion Predicates before
333   // the unswitched loop selector are killed.
334   void move_parse_and_template_assertion_predicates_to_unswitched_loops(
335     const LoopSelector& loop_selector, const uint first_false_path_loop_node_index) const {
336     const NodeInOriginalLoopBody node_in_true_path_loop_body(first_false_path_loop_node_index, _old_new);
337     const NodeInClonedLoopBody node_in_false_path_loop_body(first_false_path_loop_node_index);
338     CloneUnswitchedLoopPredicatesVisitor
339     clone_unswitched_loop_predicates_visitor(_loop_head, old_to_new(_loop_head)->as_Loop(), node_in_true_path_loop_body,
340                                              node_in_false_path_loop_body, _phase);
341     Node* source_loop_entry = loop_selector.selector()->in(0);
342     PredicateIterator predicate_iterator(source_loop_entry);
343     predicate_iterator.for_each(clone_unswitched_loop_predicates_visitor);
344   }
345 
346 #ifdef ASSERT
347   void verify_loop_versions(LoopNode* true_path_loop_head,
348                             const LoopSelector& loop_selector) const {
349     verify_loop_version(true_path_loop_head,
350                         loop_selector.true_path_loop_proj());
351     verify_loop_version(old_to_new(true_path_loop_head)->as_Loop(),
352                         loop_selector.false_path_loop_proj());
353   }
354 
355   static void verify_loop_version(LoopNode* loop_head, IfProjNode* loop_selector_if_proj) {
356     Node* entry = loop_head->skip_strip_mined()->in(LoopNode::EntryControl);
357     const Predicates predicates(entry);
358     // When skipping all predicates, we should end up at 'loop_selector_if_proj'.
359     assert(loop_selector_if_proj == predicates.entry(), "should end up at loop selector If");
360   }
361 #endif // ASSERT
362 
363   Node* old_to_new(const Node* old) const {
364     return _old_new[old->_idx];
365   }
366 
367   // Remove the unswitch candidate If nodes in both unswitched loop versions which are now dominated by the loop selector
368   // If node. Keep the true-path-path in the true-path-loop and the false-path-path in the false-path-loop by setting
369   // the bool input accordingly. The unswitch candidate If nodes are folded in the next IGVN round.
370   void remove_unswitch_candidate_from_loops(const UnswitchedLoopSelector& unswitched_loop_selector) {
371     const LoopSelector& loop_selector = unswitched_loop_selector.loop_selector();;
372     IfNode* unswitch_candidate        = unswitched_loop_selector.unswitch_candidate();
373     _phase->igvn().rehash_node_delayed(unswitch_candidate);
374     _phase->dominated_by(loop_selector.true_path_loop_proj(), unswitch_candidate);
375 
376     IfNode* unswitch_candidate_clone = _old_new[unswitch_candidate->_idx]->as_If();
377     _phase->igvn().rehash_node_delayed(unswitch_candidate_clone);
378     _phase->dominated_by(loop_selector.false_path_loop_proj(), unswitch_candidate_clone);
379   }
380 };
381 
382 // See comments below file header for more information about Loop Unswitching.
383 void PhaseIdealLoop::do_unswitching(IdealLoopTree* loop, Node_List& old_new) {
384   assert(LoopUnswitching, "LoopUnswitching must be enabled");
385 
386   LoopNode* original_head = loop->_head->as_Loop();
387   if (has_control_dependencies_from_predicates(original_head)) {
388     NOT_PRODUCT(trace_loop_unswitching_impossible(original_head);)
389     return;
390   }
391 
392   NOT_PRODUCT(trace_loop_unswitching_count(loop, original_head);)
393   C->print_method(PHASE_BEFORE_LOOP_UNSWITCHING, 4, original_head);
394 
395   revert_to_normal_loop(original_head);
396 
397   const UnswitchedLoopSelector unswitched_loop_selector(loop);
398   OriginalLoop original_loop(loop, old_new);
399   original_loop.unswitch(unswitched_loop_selector);
400 
401   hoist_invariant_check_casts(loop, old_new, unswitched_loop_selector);
402   add_unswitched_loop_version_bodies_to_igvn(loop, old_new);
403 
404   LoopNode* new_head = old_new[original_head->_idx]->as_Loop();
405   increment_unswitch_counts(original_head, new_head);
406 
407   NOT_PRODUCT(trace_loop_unswitching_result(unswitched_loop_selector, original_head, new_head);)
408   C->print_method(PHASE_AFTER_LOOP_UNSWITCHING, 4, new_head);
409   C->set_major_progress();
410 }
411 
412 void PhaseIdealLoop::do_multiversioning(IdealLoopTree* lpt, Node_List& old_new) {
413 #ifndef PRODUCT
414   if (TraceLoopOpts || TraceLoopMultiversioning) {
415     tty->print("Multiversion ");
416     lpt->dump_head();
417   }
418 #endif
419   assert(LoopMultiversioning, "LoopMultiversioning must be enabled");
420 
421   CountedLoopNode* original_head = lpt->_head->as_CountedLoop();
422   C->print_method(PHASE_BEFORE_LOOP_MULTIVERSIONING, 4, original_head);
423 
424   Node* one = _igvn.intcon(1);
425   set_ctrl(one, C->root());
426   Node* opaque = new OpaqueMultiversioningNode(C, one);
427   set_ctrl(opaque, C->root());
428   _igvn.register_new_node_with_optimizer(opaque);
429   _igvn.set_type(opaque, TypeInt::BOOL);
430 
431   const LoopSelector loop_selector(lpt, opaque, PROB_LIKELY_MAG(3), COUNT_UNKNOWN);
432   OriginalLoop original_loop(lpt, old_new);
433   original_loop.multiversion(loop_selector);
434 
435   add_unswitched_loop_version_bodies_to_igvn(lpt, old_new);
436 
437   CountedLoopNode* new_head = old_new[original_head->_idx]->as_CountedLoop();
438   original_head->set_multiversion_fast_loop();
439   new_head->set_multiversion_delayed_slow_loop();
440 
441   NOT_PRODUCT(trace_loop_multiversioning_result(loop_selector, original_head, new_head);)
442   C->print_method(PHASE_AFTER_LOOP_MULTIVERSIONING, 4, new_head);
443   C->set_major_progress();
444 }
445 
446 // Create a new if in the multiversioning pattern, adding an additional condition for the
447 // multiversioning fast-loop.
448 //
449 // Before:
450 //                       entry  opaque
451 //                         |      |
452 //                      multiversion_if
453 //                         |      |
454 //        +----------------+      +---------------+
455 //        |                                       |
456 //   multiversion_fast_proj          multiversion_slow_proj
457 //                                                |
458 //                                                +--------+
459 //                                                         |
460 //                                                      slow_path
461 //
462 //
463 // After:
464 //                     entry  opaque <-- to be replaced by caller
465 //                         |  |
466 //                        new_if
467 //                         |  |
468 //                         |  +-----------------------------+
469 //                         |                                |
470 //                 new_if_true  opaque                new_if_false
471 //                         |      |                         |
472 //                      multiversion_if                     |
473 //                         |      |                         |
474 //        +----------------+      +---------------+         |
475 //        |                                       |         |
476 //   multiversion_fast_proj      new_multiversion_slow_proj |
477 //                                                |         |
478 //                                                +------+  |
479 //                                                       |  |
480 //                                                      region
481 //                                                         |
482 //                                                      slow_path
483 //
484 IfTrueNode* PhaseIdealLoop::create_new_if_for_multiversion(IfTrueNode* multiversioning_fast_proj) {
485   // Give all nodes in the old sub-graph a name.
486   IfNode* multiversion_if = multiversioning_fast_proj->in(0)->as_If();
487   Node* entry = multiversion_if->in(0);
488   OpaqueMultiversioningNode* opaque = multiversion_if->in(1)->as_OpaqueMultiversioning();
489   IfFalseNode* multiversion_slow_proj = multiversion_if->proj_out(0)->as_IfFalse();
490   Node* slow_path = multiversion_slow_proj->unique_ctrl_out();
491 
492   // The slow_loop may still be delayed, and waiting for runtime-checks to be added to the
493   // multiversion_if. Now that we have at least one condition for the multiversioning,
494   // we should resume optimizations for the slow loop.
495   opaque->notify_slow_loop_that_it_can_resume_optimizations();
496 
497   // Create new_if with its projections.
498   IfNode* new_if = IfNode::make_with_same_profile(multiversion_if, entry, opaque);
499   IdealLoopTree* lp = get_loop(entry);
500   register_control(new_if, lp, entry);
501 
502   IfTrueNode*  new_if_true  = new IfTrueNode(new_if);
503   IfFalseNode* new_if_false = new IfFalseNode(new_if);
504   register_control(new_if_true,  lp, new_if);
505   register_control(new_if_false, lp, new_if);
506 
507   // Hook new_if_true into multiversion_if.
508   _igvn.replace_input_of(multiversion_if, 0, new_if_true);
509 
510   // Clone multiversion_slow_path - this allows us to easily carry the dependencies to
511   // the new region below.
512   IfFalseNode* new_multiversion_slow_proj = multiversion_slow_proj->clone()->as_IfFalse();
513   register_control(new_multiversion_slow_proj, lp, multiversion_if);
514 
515   // Create new Region.
516   RegionNode* region = new RegionNode(1);
517   region->add_req(new_multiversion_slow_proj);
518   region->add_req(new_if_false);
519   register_control(region, lp, new_multiversion_slow_proj);
520 
521   // Hook region into slow_path, in stead of the multiversion_slow_proj.
522   // This also moves all other dependencies of the multiversion_slow_proj to the region.
523   _igvn.replace_node(multiversion_slow_proj, region);
524 
525   return new_if_true;
526 }
527 
528 OpaqueMultiversioningNode* find_multiversion_opaque_from_multiversion_if_false(Node* maybe_multiversion_if_false) {
529   IfFalseNode* multiversion_if_false = maybe_multiversion_if_false->isa_IfFalse();
530   if (multiversion_if_false == nullptr) { return nullptr; }
531   IfNode* multiversion_if = multiversion_if_false->in(0)->isa_If();
532   if (multiversion_if == nullptr) { return nullptr; }
533   return multiversion_if->in(1)->isa_OpaqueMultiversioning();
534 }
535 
536 bool PhaseIdealLoop::try_resume_optimizations_for_delayed_slow_loop(IdealLoopTree* lpt) {
537   CountedLoopNode* cl = lpt->_head->as_CountedLoop();
538   assert(cl->is_multiversion_delayed_slow_loop(), "must currently be delayed");
539 
540   // Find multiversion_if.
541   Node* entry = cl->skip_strip_mined()->in(LoopNode::EntryControl);
542   const Predicates predicates(entry);
543 
544   Node* slow_path = predicates.entry();
545 
546   // Find opaque.
547   OpaqueMultiversioningNode* opaque = nullptr;
548   if (slow_path->is_Region()) {
549     for (uint i = 1; i < slow_path->req(); i++) {
550       Node* n = slow_path->in(i);
551       opaque = find_multiversion_opaque_from_multiversion_if_false(n);
552       if (opaque != nullptr) { break; }
553     }
554   } else {
555     opaque = find_multiversion_opaque_from_multiversion_if_false(slow_path);
556   }
557   assert(opaque != nullptr, "must have found multiversion opaque node");
558   if (opaque == nullptr) { return false; }
559 
560   // We may still be delayed, if there were not yet any runtime-checks added
561   // for the multiversioning. We may never add any, and then this loop would
562   // fold away. So we wait until some runtime-checks are added, then we know
563   // that this loop will be reachable and it is worth optimizing further.
564   if (opaque->is_delayed_slow_loop()) { return false; }
565 
566   // Clear away the "delayed" status, i.e. resume optimizations.
567   cl->set_no_multiversion();
568   cl->set_multiversion_slow_loop();
569 #ifndef PRODUCT
570   if (TraceLoopOpts) {
571     tty->print("Resume Optimizations ");
572     lpt->dump_head();
573   }
574 #endif
575   return true;
576 }
577 
578 bool PhaseIdealLoop::has_control_dependencies_from_predicates(LoopNode* head) {
579   Node* entry = head->skip_strip_mined()->in(LoopNode::EntryControl);
580   const Predicates predicates(entry);
581   if (predicates.has_any()) {
582     assert(entry->is_IfProj(), "sanity - must be ifProj since there is at least one predicate");
583     if (entry->outcnt() > 1) {
584       // Bailout if there are predicates from which there are additional control dependencies (i.e. from loop
585       // entry 'entry') to previously partially peeled statements since this case is not handled and can lead
586       // to a wrong execution. Remove this bailout, once this is fixed.
587       return true;
588     }
589   }
590   return false;
591 }
592 
593 #ifndef PRODUCT
594 void PhaseIdealLoop::trace_loop_unswitching_impossible(const LoopNode* original_head) {
595   if (TraceLoopUnswitching) {
596     tty->print_cr("Loop Unswitching \"%d %s\" not possible due to control dependencies",
597                   original_head->_idx, original_head->Name());
598   }
599 }
600 
601 void PhaseIdealLoop::trace_loop_unswitching_count(IdealLoopTree* loop, LoopNode* original_head) {
602   if (TraceLoopOpts) {
603     tty->print("Unswitch   %d ", original_head->unswitch_count() + 1);
604     loop->dump_head();
605   }
606 }
607 
608 void PhaseIdealLoop::trace_loop_unswitching_result(const UnswitchedLoopSelector& unswitched_loop_selector,
609                                                    const LoopNode* original_head, const LoopNode* new_head) {
610   if (TraceLoopUnswitching) {
611     IfNode* unswitch_candidate = unswitched_loop_selector.unswitch_candidate();
612     IfNode* loop_selector = unswitched_loop_selector.loop_selector().selector();
613     tty->print_cr("Loop Unswitching:");
614     tty->print_cr("- Unswitch-Candidate-If: %d %s", unswitch_candidate->_idx, unswitch_candidate->Name());
615     tty->print_cr("- Loop-Selector-If: %d %s", loop_selector->_idx, loop_selector->Name());
616     tty->print_cr("- True-Path-Loop (=Orig): %d %s", original_head->_idx, original_head->Name());
617     tty->print_cr("- False-Path-Loop (=Clone): %d %s", new_head->_idx, new_head->Name());
618   }
619 }
620 
621 void PhaseIdealLoop::trace_loop_multiversioning_result(const LoopSelector& loop_selector,
622                                                        const LoopNode* original_head, const LoopNode* new_head) {
623   if (TraceLoopMultiversioning) {
624     IfNode* selector_if = loop_selector.selector();
625     tty->print_cr("Loop Multiversioning:");
626     tty->print_cr("- Loop-Selector-If: %d %s", selector_if->_idx, selector_if->Name());
627     tty->print_cr("- True-Path-Loop (=Orig / Fast): %d %s", original_head->_idx, original_head->Name());
628     tty->print_cr("- False-Path-Loop (=Clone / Slow): %d %s", new_head->_idx, new_head->Name());
629   }
630 }
631 #endif
632 
633 // When unswitching a counted loop, we need to convert it back to a normal loop since it's not a proper pre, main or,
634 // post loop anymore after loop unswitching. We also lose the multiversion structure, with access to the multiversion_if.
635 void PhaseIdealLoop::revert_to_normal_loop(const LoopNode* loop_head) {
636   CountedLoopNode* cl = loop_head->isa_CountedLoop();
637   if (cl == nullptr) { return; }
638   if (!cl->is_normal_loop()) { cl->set_normal_loop(); }
639   if (cl->is_multiversion()) { cl->set_no_multiversion(); }
640 }
641 
642 // Hoist invariant CheckCastPPNodes out of each unswitched loop version to the appropriate loop selector If projection.
643 void PhaseIdealLoop::hoist_invariant_check_casts(const IdealLoopTree* loop, const Node_List& old_new,
644                                                  const UnswitchedLoopSelector& unswitched_loop_selector) {
645   IfNode* unswitch_candidate = unswitched_loop_selector.unswitch_candidate();
646   IfNode* loop_selector = unswitched_loop_selector.loop_selector().selector();
647   ResourceMark rm;
648   GrowableArray<CheckCastPPNode*> loop_invariant_check_casts;
649   for (DUIterator_Fast imax, i = unswitch_candidate->fast_outs(imax); i < imax; i++) {
650     IfProjNode* proj = unswitch_candidate->fast_out(i)->as_IfProj();
651     // Copy to a worklist for easier manipulation
652     for (DUIterator_Fast jmax, j = proj->fast_outs(jmax); j < jmax; j++) {
653       CheckCastPPNode* check_cast = proj->fast_out(j)->isa_CheckCastPP();
654       if (check_cast != nullptr && loop->is_invariant(check_cast->in(1))) {
655         loop_invariant_check_casts.push(check_cast);
656       }
657     }
658     IfProjNode* loop_selector_if_proj = loop_selector->proj_out(proj->_con)->as_IfProj();
659     while (loop_invariant_check_casts.length() > 0) {
660       CheckCastPPNode* cast = loop_invariant_check_casts.pop();
661       Node* cast_clone = cast->clone();
662       cast_clone->set_req(0, loop_selector_if_proj);
663       _igvn.replace_input_of(cast, 1, cast_clone);
664       register_new_node(cast_clone, loop_selector_if_proj);
665       // Same for the clone
666       Node* use_clone = old_new[cast->_idx];
667       _igvn.replace_input_of(use_clone, 1, cast_clone);
668     }
669   }
670 }
671 
672 // Enable more optimizations possibilities in the next IGVN round.
673 void PhaseIdealLoop::add_unswitched_loop_version_bodies_to_igvn(IdealLoopTree* loop, const Node_List& old_new) {
674   loop->record_for_igvn();
675   for(int i = loop->_body.size() - 1; i >= 0 ; i--) {
676     Node* n = loop->_body[i];
677     Node* n_clone = old_new[n->_idx];
678     _igvn._worklist.push(n_clone);
679   }
680 }
681 
682 void PhaseIdealLoop::increment_unswitch_counts(LoopNode* original_head, LoopNode* new_head) {
683   const int unswitch_count = original_head->unswitch_count() + 1;
684   original_head->set_unswitch_count(unswitch_count);
685   new_head->set_unswitch_count(unswitch_count);
686 }
687