< prev index next >
src/hotspot/share/opto/loopopts.cpp
Print this page
@@ -38,10 +38,14 @@
#include "opto/mulnode.hpp"
#include "opto/movenode.hpp"
#include "opto/opaquenode.hpp"
#include "opto/rootnode.hpp"
#include "opto/subnode.hpp"
+#include "utilities/macros.hpp"
+#if INCLUDE_ZGC
+#include "gc/z/c2/zBarrierSetC2.hpp"
+#endif
//=============================================================================
//------------------------------split_thru_phi---------------------------------
// Split Node 'n' through merge point if there is enough win.
Node *PhaseIdealLoop::split_thru_phi( Node *n, Node *region, int policy ) {
@@ -1124,15 +1128,15 @@
//------------------------------split_if_with_blocks_post----------------------
// Do the real work in a non-recursive function. CFG hackery wants to be
// in the post-order, so it can dirty the I-DOM info and not use the dirtied
// info.
-void PhaseIdealLoop::split_if_with_blocks_post(Node *n) {
+void PhaseIdealLoop::split_if_with_blocks_post(Node *n, bool last_round) {
// Cloning Cmp through Phi's involves the split-if transform.
// FastLock is not used by an If
- if (n->is_Cmp() && !n->is_FastLock()) {
+ if (n->is_Cmp() && !n->is_FastLock() && !last_round) {
Node *n_ctrl = get_ctrl(n);
// Determine if the Node has inputs from some local Phi.
// Returns the block to clone thru.
Node *n_blk = has_local_phi_input(n);
if (n_blk != n_ctrl) {
@@ -1375,16 +1379,22 @@
if( n_op == Op_Opaque2 &&
n->in(1) != NULL &&
get_loop(get_ctrl(n)) == get_loop(get_ctrl(n->in(1))) ) {
_igvn.replace_node( n, n->in(1) );
}
+
+#if INCLUDE_ZGC
+ if (UseZGC) {
+ ZBarrierSetC2::loop_optimize_gc_barrier(this, n, last_round);
+ }
+#endif
}
//------------------------------split_if_with_blocks---------------------------
// Check for aggressive application of 'split-if' optimization,
// using basic block level info.
-void PhaseIdealLoop::split_if_with_blocks( VectorSet &visited, Node_Stack &nstack ) {
+void PhaseIdealLoop::split_if_with_blocks(VectorSet &visited, Node_Stack &nstack, bool last_round) {
Node *n = C->root();
visited.set(n->_idx); // first, mark node as visited
// Do pre-visit work for root
n = split_if_with_blocks_pre( n );
uint cnt = n->outcnt();
@@ -1405,11 +1415,11 @@
}
else {
// All of n's children have been processed, complete post-processing.
if (cnt != 0 && !n->is_Con()) {
assert(has_node(n), "no dead nodes");
- split_if_with_blocks_post( n );
+ split_if_with_blocks_post( n, last_round );
}
if (nstack.is_empty()) {
// Finished all nodes on stack.
break;
}
< prev index next >