Merge

Thu, 26 Jul 2012 23:43:36 -0700

author
jmasa
date
Thu, 26 Jul 2012 23:43:36 -0700
changeset 3959
3080f4743cf2
parent 3958
113f4c73df61
parent 3949
bcd1b9d98558
child 3960
ff58dfd5b977

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

mercurial