Thu, 26 Jul 2012 23:43:36 -0700
Merge
1.1 --- a/make/solaris/makefiles/fastdebug.make Tue Jul 24 14:48:58 2012 -0700 1.2 +++ b/make/solaris/makefiles/fastdebug.make Thu Jul 26 23:43:36 2012 -0700 1.3 @@ -36,6 +36,11 @@ 1.4 ifeq ("${Platform_compiler}", "sparcWorks") 1.5 OPT_CFLAGS/SLOWER = -xO2 1.6 1.7 +ifeq ($(COMPILER_REV_NUMERIC), 510) 1.8 +# CC 5.10 has bug XXXXX with -xO4 1.9 +OPT_CFLAGS/jvmtiClassFileReconstituter.o = $(OPT_CFLAGS/SLOWER) 1.10 +endif # COMPILER_REV_NUMERIC == 510 1.11 + 1.12 ifeq ($(COMPILER_REV_NUMERIC), 509) 1.13 # To avoid jvm98 crash 1.14 OPT_CFLAGS/instanceKlass.o = $(OPT_CFLAGS/SLOWER)
2.1 --- a/make/solaris/makefiles/optimized.make Tue Jul 24 14:48:58 2012 -0700 2.2 +++ b/make/solaris/makefiles/optimized.make Thu Jul 26 23:43:36 2012 -0700 2.3 @@ -32,6 +32,11 @@ 2.4 # (OPT_CFLAGS/SLOWER is also available, to alter compilation of buggy files) 2.5 ifeq ("${Platform_compiler}", "sparcWorks") 2.6 2.7 +ifeq ($(COMPILER_REV_NUMERIC), 510) 2.8 +# CC 5.10 has bug XXXXX with -xO4 2.9 +OPT_CFLAGS/jvmtiClassFileReconstituter.o = $(OPT_CFLAGS/O2) 2.10 +endif # COMPILER_REV_NUMERIC == 510 2.11 + 2.12 ifeq ($(shell expr $(COMPILER_REV_NUMERIC) \>= 509), 1) 2.13 # dtrace cannot handle tail call optimization (6672627, 6693876) 2.14 OPT_CFLAGS/jni.o = $(OPT_CFLAGS/DEFAULT) $(OPT_CCFLAGS/NO_TAIL_CALL_OPT)
3.1 --- a/make/solaris/makefiles/product.make Tue Jul 24 14:48:58 2012 -0700 3.2 +++ b/make/solaris/makefiles/product.make Thu Jul 26 23:43:36 2012 -0700 3.3 @@ -40,6 +40,11 @@ 3.4 # (OPT_CFLAGS/SLOWER is also available, to alter compilation of buggy files) 3.5 ifeq ("${Platform_compiler}", "sparcWorks") 3.6 3.7 +ifeq ($(COMPILER_REV_NUMERIC), 510) 3.8 +# CC 5.10 has bug XXXXX with -xO4 3.9 +OPT_CFLAGS/jvmtiClassFileReconstituter.o = $(OPT_CFLAGS/O2) 3.10 +endif # COMPILER_REV_NUMERIC == 510 3.11 + 3.12 ifeq ($(shell expr $(COMPILER_REV_NUMERIC) \>= 509), 1) 3.13 # dtrace cannot handle tail call optimization (6672627, 6693876) 3.14 OPT_CFLAGS/jni.o = $(OPT_CFLAGS/DEFAULT) $(OPT_CCFLAGS/NO_TAIL_CALL_OPT)
4.1 --- a/src/share/vm/opto/phaseX.cpp Tue Jul 24 14:48:58 2012 -0700 4.2 +++ b/src/share/vm/opto/phaseX.cpp Thu Jul 26 23:43:36 2012 -0700 4.3 @@ -757,6 +757,7 @@ 4.4 //------------------------------PhaseIterGVN----------------------------------- 4.5 // Initialize hash table to fresh and clean for +VerifyOpto 4.6 PhaseIterGVN::PhaseIterGVN( PhaseIterGVN *igvn, const char *dummy ) : PhaseGVN(igvn,dummy), _worklist( ), 4.7 + _stack(C->unique() >> 1), 4.8 _delay_transform(false) { 4.9 } 4.10 4.11 @@ -764,6 +765,7 @@ 4.12 // Initialize with previous PhaseIterGVN info; used by PhaseCCP 4.13 PhaseIterGVN::PhaseIterGVN( PhaseIterGVN *igvn ) : PhaseGVN(igvn), 4.14 _worklist( igvn->_worklist ), 4.15 + _stack( igvn->_stack ), 4.16 _delay_transform(igvn->_delay_transform) 4.17 { 4.18 } 4.19 @@ -772,6 +774,7 @@ 4.20 // Initialize with previous PhaseGVN info from Parser 4.21 PhaseIterGVN::PhaseIterGVN( PhaseGVN *gvn ) : PhaseGVN(gvn), 4.22 _worklist(*C->for_igvn()), 4.23 + _stack(C->unique() >> 1), 4.24 _delay_transform(false) 4.25 { 4.26 uint max; 4.27 @@ -1138,51 +1141,77 @@ 4.28 // Kill a globally dead Node. All uses are also globally dead and are 4.29 // aggressively trimmed. 4.30 void PhaseIterGVN::remove_globally_dead_node( Node *dead ) { 4.31 - assert(dead != C->root(), "killing root, eh?"); 4.32 - if (dead->is_top()) return; 4.33 - NOT_PRODUCT( set_progress(); ) 4.34 - // Remove from iterative worklist 4.35 - _worklist.remove(dead); 4.36 - if (!dead->is_Con()) { // Don't kill cons but uses 4.37 - // Remove from hash table 4.38 - _table.hash_delete( dead ); 4.39 - // Smash all inputs to 'dead', isolating him completely 4.40 - for( uint i = 0; i < dead->req(); i++ ) { 4.41 - Node *in = dead->in(i); 4.42 - if( in ) { // Points to something? 4.43 - dead->set_req(i,NULL); // Kill the edge 4.44 - if (in->outcnt() == 0 && in != C->top()) {// Made input go dead? 4.45 - remove_dead_node(in); // Recursively remove 4.46 - } else if (in->outcnt() == 1 && 4.47 - in->has_special_unique_user()) { 4.48 - _worklist.push(in->unique_out()); 4.49 - } else if (in->outcnt() <= 2 && dead->is_Phi()) { 4.50 - if( in->Opcode() == Op_Region ) 4.51 - _worklist.push(in); 4.52 - else if( in->is_Store() ) { 4.53 - DUIterator_Fast imax, i = in->fast_outs(imax); 4.54 - _worklist.push(in->fast_out(i)); 4.55 - i++; 4.56 - if(in->outcnt() == 2) { 4.57 - _worklist.push(in->fast_out(i)); 4.58 - i++; 4.59 + enum DeleteProgress { 4.60 + PROCESS_INPUTS, 4.61 + PROCESS_OUTPUTS 4.62 + }; 4.63 + assert(_stack.is_empty(), "not empty"); 4.64 + _stack.push(dead, PROCESS_INPUTS); 4.65 + 4.66 + while (_stack.is_nonempty()) { 4.67 + dead = _stack.node(); 4.68 + uint progress_state = _stack.index(); 4.69 + assert(dead != C->root(), "killing root, eh?"); 4.70 + assert(!dead->is_top(), "add check for top when pushing"); 4.71 + NOT_PRODUCT( set_progress(); ) 4.72 + if (progress_state == PROCESS_INPUTS) { 4.73 + // After following inputs, continue to outputs 4.74 + _stack.set_index(PROCESS_OUTPUTS); 4.75 + // Remove from iterative worklist 4.76 + _worklist.remove(dead); 4.77 + if (!dead->is_Con()) { // Don't kill cons but uses 4.78 + bool recurse = false; 4.79 + // Remove from hash table 4.80 + _table.hash_delete( dead ); 4.81 + // Smash all inputs to 'dead', isolating him completely 4.82 + for( uint i = 0; i < dead->req(); i++ ) { 4.83 + Node *in = dead->in(i); 4.84 + if( in ) { // Points to something? 4.85 + dead->set_req(i,NULL); // Kill the edge 4.86 + if (in->outcnt() == 0 && in != C->top()) {// Made input go dead? 4.87 + _stack.push(in, PROCESS_INPUTS); // Recursively remove 4.88 + recurse = true; 4.89 + } else if (in->outcnt() == 1 && 4.90 + in->has_special_unique_user()) { 4.91 + _worklist.push(in->unique_out()); 4.92 + } else if (in->outcnt() <= 2 && dead->is_Phi()) { 4.93 + if( in->Opcode() == Op_Region ) 4.94 + _worklist.push(in); 4.95 + else if( in->is_Store() ) { 4.96 + DUIterator_Fast imax, i = in->fast_outs(imax); 4.97 + _worklist.push(in->fast_out(i)); 4.98 + i++; 4.99 + if(in->outcnt() == 2) { 4.100 + _worklist.push(in->fast_out(i)); 4.101 + i++; 4.102 + } 4.103 + assert(!(i < imax), "sanity"); 4.104 + } 4.105 } 4.106 - assert(!(i < imax), "sanity"); 4.107 } 4.108 } 4.109 + 4.110 + if (dead->is_macro()) { 4.111 + C->remove_macro_node(dead); 4.112 + } 4.113 + 4.114 + if (recurse) { 4.115 + continue; 4.116 + } 4.117 } 4.118 } 4.119 4.120 - if (dead->is_macro()) { 4.121 - C->remove_macro_node(dead); 4.122 + // Aggressively kill globally dead uses 4.123 + // (Rather than pushing all the outs at once, we push one at a time, 4.124 + // plus the parent to resume later, because of the indefinite number 4.125 + // of edge deletions per loop trip.) 4.126 + if (dead->outcnt() > 0) { 4.127 + // Recursively remove 4.128 + _stack.push(dead->raw_out(0), PROCESS_INPUTS); 4.129 + } else { 4.130 + _stack.pop(); 4.131 } 4.132 } 4.133 - // Aggressively kill globally dead uses 4.134 - // (Cannot use DUIterator_Last because of the indefinite number 4.135 - // of edge deletions per loop trip.) 4.136 - while (dead->outcnt() > 0) { 4.137 - remove_globally_dead_node(dead->raw_out(0)); 4.138 - } 4.139 } 4.140 4.141 //------------------------------subsume_node-----------------------------------
5.1 --- a/src/share/vm/opto/phaseX.hpp Tue Jul 24 14:48:58 2012 -0700 5.2 +++ b/src/share/vm/opto/phaseX.hpp Thu Jul 26 23:43:36 2012 -0700 5.3 @@ -403,6 +403,8 @@ 5.4 // Subsume users of node 'old' into node 'nn' 5.5 void subsume_node( Node *old, Node *nn ); 5.6 5.7 + Node_Stack _stack; // Stack used to avoid recursion 5.8 + 5.9 protected: 5.10 5.11 // Idealize new Node 'n' with respect to its inputs and its value 5.12 @@ -438,8 +440,8 @@ 5.13 // It is significant only for debugging and profiling. 5.14 Node* register_new_node_with_optimizer(Node* n, Node* orig = NULL); 5.15 5.16 - // Kill a globally dead Node. It is allowed to have uses which are 5.17 - // assumed dead and left 'in limbo'. 5.18 + // Kill a globally dead Node. All uses are also globally dead and are 5.19 + // aggressively trimmed. 5.20 void remove_globally_dead_node( Node *dead ); 5.21 5.22 // Kill all inputs to a dead node, recursively making more dead nodes.
6.1 --- a/test/runtime/7020373/Test7020373.sh Tue Jul 24 14:48:58 2012 -0700 6.2 +++ b/test/runtime/7020373/Test7020373.sh Thu Jul 26 23:43:36 2012 -0700 6.3 @@ -2,9 +2,10 @@ 6.4 6.5 ## 6.6 ## @test 6.7 -## @bug 7020373 7055247 7053586 6.8 +## @bug 7020373 7055247 7053586 7185550 6.9 ## @key cte_test 6.10 ## @summary JSR rewriting can overflow memory address size variables 6.11 +## @ignore Ignore it as 7053586 test uses lots of memory. See bug report for detail. 6.12 ## @run shell Test7020373.sh 6.13 ## 6.14
7.1 Binary file test/runtime/7020373/testcase.jar has changed