--- old/src/hotspot/share/opto/loopnode.hpp 2018-02-14 10:51:51.637257382 +0100 +++ new/src/hotspot/share/opto/loopnode.hpp 2018-02-14 10:51:47.039254677 +0100 @@ -539,7 +539,7 @@ // Return TRUE or FALSE if the loop should be unswitched -- clone // loop with an invariant test - bool policy_unswitching( PhaseIdealLoop *phase ) const; + bool policy_unswitching(PhaseIdealLoop *phase, bool shenandoah_opts = false) const; // Micro-benchmark spamming. Remove empty loops. bool policy_do_remove_empty_loop( PhaseIdealLoop *phase ); @@ -1128,10 +1128,10 @@ // Clone loop with an invariant test (that does not exit) and // insert a clone of the test that selects which version to // execute. - void do_unswitching (IdealLoopTree *loop, Node_List &old_new); + void do_unswitching(IdealLoopTree *loop, Node_List &old_new, bool shenandoah_opts = false); // Find candidate "if" for unswitching - IfNode* find_unswitching_candidate(const IdealLoopTree *loop) const; + IfNode* find_unswitching_candidate(const IdealLoopTree *loop, bool shenandoah_opts) const; // Range Check Elimination uses this function! // Constrain the main loop iterations so the affine function: @@ -1258,6 +1258,7 @@ Unique_Node_List _shenandoah_evacuation_tests; Unique_Node_List _shenandoah_gc_state_loads; + Unique_Node_List _shenandoah_heap_stable_tests; bool _created_loop_node; public: