< prev index next >

src/hotspot/share/gc/z/c2/zBarrierSetC2.cpp

Print this page




 979 
 980   assert(barrier->outcnt() == 0,"LoadBarrier macro node has non-null outputs after expansion!");
 981 
 982 #ifdef PRINT_NODE_TRAVERSALS
 983   tty->print("\nAfter barrier optimization:  old out_ctrl\n");
 984   traverse(out_ctrl, out_ctrl, out_res, -1);
 985   tty->print("\nAfter barrier optimization:  old out_res\n");
 986   traverse(out_res, out_ctrl, out_res, -1);
 987   tty->print("\nAfter barrier optimization:  old barrier\n");
 988   traverse(barrier, out_ctrl, out_res, -1);
 989   tty->print("\nAfter barrier optimization:  preceding_barrier_node\n");
 990   traverse(preceding_barrier_node, result_region, result_phi, -1);
 991 #endif
 992 
 993   assert(is_gc_barrier_node(result_phi), "sanity");
 994   assert(step_over_gc_barrier(result_phi) == in_val, "sanity");
 995 
 996   return;
 997 }
 998 
 999 bool ZBarrierSetC2::expand_macro_nodes(PhaseMacroExpand* macro) const {
1000   Compile* C = Compile::current();
1001   PhaseIterGVN &igvn = macro->igvn();
1002   ZBarrierSetC2State* s = state();
1003   if (s->load_barrier_count() > 0) {
1004 #ifdef ASSERT
1005     verify_gc_barriers(false);
1006 #endif
1007     igvn.set_delay_transform(true);
1008     int skipped = 0;
1009     while (s->load_barrier_count() > skipped) {
1010       int load_barrier_count = s->load_barrier_count();
1011       LoadBarrierNode * n = s->load_barrier_node(load_barrier_count-1-skipped);
1012       if (igvn.type(n) == Type::TOP || (n->in(0) != NULL && n->in(0)->is_top())) {
1013         // Node is unreachable, so don't try to expand it
1014         s->remove_load_barrier_node(n);
1015         continue;
1016       }
1017       if (!n->can_be_eliminated()) {
1018         skipped++;
1019         continue;
1020       }
1021       expand_loadbarrier_node(macro, n);
1022       assert(s->load_barrier_count() < load_barrier_count, "must have deleted a node from load barrier list");
1023       if (C->failing())  return true;
1024     }
1025     while (s->load_barrier_count() > 0) {
1026       int load_barrier_count = s->load_barrier_count();
1027       LoadBarrierNode* n = s->load_barrier_node(load_barrier_count - 1);
1028       assert(!(igvn.type(n) == Type::TOP || (n->in(0) != NULL && n->in(0)->is_top())), "should have been processed already");
1029       assert(!n->can_be_eliminated(), "should have been processed already");
1030       expand_loadbarrier_node(macro, n);
1031       assert(s->load_barrier_count() < load_barrier_count, "must have deleted a node from load barrier list");
1032       if (C->failing())  return true;
1033     }
1034     igvn.set_delay_transform(false);
1035     igvn.optimize();
1036     if (C->failing())  return true;
1037   }
1038   return false;
1039 }
1040 
1041 // == Loop optimization ==
1042 
1043 static bool replace_with_dominating_barrier(PhaseIdealLoop* phase, LoadBarrierNode* lb, bool last_round) {
1044   PhaseIterGVN &igvn = phase->igvn();
1045   Compile* C = Compile::current();
1046 
1047   LoadBarrierNode* lb2 = lb->has_dominating_barrier(phase, false, last_round);
1048   if (lb2 != NULL) {
1049     if (lb->in(LoadBarrierNode::Oop) != lb2->in(LoadBarrierNode::Oop)) {
1050       assert(lb->in(LoadBarrierNode::Address) == lb2->in(LoadBarrierNode::Address), "");




 979 
 980   assert(barrier->outcnt() == 0,"LoadBarrier macro node has non-null outputs after expansion!");
 981 
 982 #ifdef PRINT_NODE_TRAVERSALS
 983   tty->print("\nAfter barrier optimization:  old out_ctrl\n");
 984   traverse(out_ctrl, out_ctrl, out_res, -1);
 985   tty->print("\nAfter barrier optimization:  old out_res\n");
 986   traverse(out_res, out_ctrl, out_res, -1);
 987   tty->print("\nAfter barrier optimization:  old barrier\n");
 988   traverse(barrier, out_ctrl, out_res, -1);
 989   tty->print("\nAfter barrier optimization:  preceding_barrier_node\n");
 990   traverse(preceding_barrier_node, result_region, result_phi, -1);
 991 #endif
 992 
 993   assert(is_gc_barrier_node(result_phi), "sanity");
 994   assert(step_over_gc_barrier(result_phi) == in_val, "sanity");
 995 
 996   return;
 997 }
 998 
 999 bool ZBarrierSetC2::expand_barriers(Compile* C, PhaseIterGVN& igvn) const {
1000   PhaseMacroExpand macro(igvn);

1001   ZBarrierSetC2State* s = state();
1002   if (s->load_barrier_count() > 0) {
1003 #ifdef ASSERT
1004     verify_gc_barriers(false);
1005 #endif
1006     igvn.set_delay_transform(true);
1007     int skipped = 0;
1008     while (s->load_barrier_count() > skipped) {
1009       int load_barrier_count = s->load_barrier_count();
1010       LoadBarrierNode * n = s->load_barrier_node(load_barrier_count-1-skipped);
1011       if (igvn.type(n) == Type::TOP || (n->in(0) != NULL && n->in(0)->is_top())) {
1012         // Node is unreachable, so don't try to expand it
1013         s->remove_load_barrier_node(n);
1014         continue;
1015       }
1016       if (!n->can_be_eliminated()) {
1017         skipped++;
1018         continue;
1019       }
1020       expand_loadbarrier_node(&macro, n);
1021       assert(s->load_barrier_count() < load_barrier_count, "must have deleted a node from load barrier list");
1022       if (C->failing())  return true;
1023     }
1024     while (s->load_barrier_count() > 0) {
1025       int load_barrier_count = s->load_barrier_count();
1026       LoadBarrierNode* n = s->load_barrier_node(load_barrier_count - 1);
1027       assert(!(igvn.type(n) == Type::TOP || (n->in(0) != NULL && n->in(0)->is_top())), "should have been processed already");
1028       assert(!n->can_be_eliminated(), "should have been processed already");
1029       expand_loadbarrier_node(&macro, n);
1030       assert(s->load_barrier_count() < load_barrier_count, "must have deleted a node from load barrier list");
1031       if (C->failing())  return true;
1032     }
1033     igvn.set_delay_transform(false);
1034     igvn.optimize();
1035     if (C->failing())  return true;
1036   }
1037   return false;
1038 }
1039 
1040 // == Loop optimization ==
1041 
1042 static bool replace_with_dominating_barrier(PhaseIdealLoop* phase, LoadBarrierNode* lb, bool last_round) {
1043   PhaseIterGVN &igvn = phase->igvn();
1044   Compile* C = Compile::current();
1045 
1046   LoadBarrierNode* lb2 = lb->has_dominating_barrier(phase, false, last_round);
1047   if (lb2 != NULL) {
1048     if (lb->in(LoadBarrierNode::Oop) != lb2->in(LoadBarrierNode::Oop)) {
1049       assert(lb->in(LoadBarrierNode::Address) == lb2->in(LoadBarrierNode::Address), "");


< prev index next >