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(¯o, 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(¯o, 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), ""); |