hotspot/src/share/vm/opto/compile.cpp
changeset 3276 bda7d4532054
parent 3273 6acf7084b1d3
child 3676 3bac3e882cd3
equal deleted inserted replaced
3275:bd2023eeea0a 3276:bda7d4532054
   439                   _code_buffer("Compile::Fill_buffer"),
   439                   _code_buffer("Compile::Fill_buffer"),
   440                   _orig_pc_slot(0),
   440                   _orig_pc_slot(0),
   441                   _orig_pc_slot_offset_in_bytes(0),
   441                   _orig_pc_slot_offset_in_bytes(0),
   442                   _node_bundling_limit(0),
   442                   _node_bundling_limit(0),
   443                   _node_bundling_base(NULL),
   443                   _node_bundling_base(NULL),
       
   444                   _java_calls(0),
       
   445                   _inner_loops(0),
   444 #ifndef PRODUCT
   446 #ifndef PRODUCT
   445                   _trace_opto_output(TraceOptoOutput || method()->has_option("TraceOptoOutput")),
   447                   _trace_opto_output(TraceOptoOutput || method()->has_option("TraceOptoOutput")),
   446                   _printer(IdealGraphPrinter::printer()),
   448                   _printer(IdealGraphPrinter::printer()),
   447 #endif
   449 #endif
   448                   _congraph(NULL) {
   450                   _congraph(NULL) {
   709     _do_escape_analysis(false),
   711     _do_escape_analysis(false),
   710     _failure_reason(NULL),
   712     _failure_reason(NULL),
   711     _code_buffer("Compile::Fill_buffer"),
   713     _code_buffer("Compile::Fill_buffer"),
   712     _node_bundling_limit(0),
   714     _node_bundling_limit(0),
   713     _node_bundling_base(NULL),
   715     _node_bundling_base(NULL),
       
   716     _java_calls(0),
       
   717     _inner_loops(0),
   714 #ifndef PRODUCT
   718 #ifndef PRODUCT
   715     _trace_opto_output(TraceOptoOutput),
   719     _trace_opto_output(TraceOptoOutput),
   716     _printer(NULL),
   720     _printer(NULL),
   717 #endif
   721 #endif
   718     _congraph(NULL) {
   722     _congraph(NULL) {
  1849 struct Final_Reshape_Counts : public StackObj {
  1853 struct Final_Reshape_Counts : public StackObj {
  1850   int  _call_count;             // count non-inlined 'common' calls
  1854   int  _call_count;             // count non-inlined 'common' calls
  1851   int  _float_count;            // count float ops requiring 24-bit precision
  1855   int  _float_count;            // count float ops requiring 24-bit precision
  1852   int  _double_count;           // count double ops requiring more precision
  1856   int  _double_count;           // count double ops requiring more precision
  1853   int  _java_call_count;        // count non-inlined 'java' calls
  1857   int  _java_call_count;        // count non-inlined 'java' calls
       
  1858   int  _inner_loop_count;       // count loops which need alignment
  1854   VectorSet _visited;           // Visitation flags
  1859   VectorSet _visited;           // Visitation flags
  1855   Node_List _tests;             // Set of IfNodes & PCTableNodes
  1860   Node_List _tests;             // Set of IfNodes & PCTableNodes
  1856 
  1861 
  1857   Final_Reshape_Counts() :
  1862   Final_Reshape_Counts() :
  1858     _call_count(0), _float_count(0), _double_count(0), _java_call_count(0),
  1863     _call_count(0), _float_count(0), _double_count(0),
       
  1864     _java_call_count(0), _inner_loop_count(0),
  1859     _visited( Thread::current()->resource_area() ) { }
  1865     _visited( Thread::current()->resource_area() ) { }
  1860 
  1866 
  1861   void inc_call_count  () { _call_count  ++; }
  1867   void inc_call_count  () { _call_count  ++; }
  1862   void inc_float_count () { _float_count ++; }
  1868   void inc_float_count () { _float_count ++; }
  1863   void inc_double_count() { _double_count++; }
  1869   void inc_double_count() { _double_count++; }
  1864   void inc_java_call_count() { _java_call_count++; }
  1870   void inc_java_call_count() { _java_call_count++; }
       
  1871   void inc_inner_loop_count() { _inner_loop_count++; }
  1865 
  1872 
  1866   int  get_call_count  () const { return _call_count  ; }
  1873   int  get_call_count  () const { return _call_count  ; }
  1867   int  get_float_count () const { return _float_count ; }
  1874   int  get_float_count () const { return _float_count ; }
  1868   int  get_double_count() const { return _double_count; }
  1875   int  get_double_count() const { return _double_count; }
  1869   int  get_java_call_count() const { return _java_call_count; }
  1876   int  get_java_call_count() const { return _java_call_count; }
       
  1877   int  get_inner_loop_count() const { return _inner_loop_count; }
  1870 };
  1878 };
  1871 
  1879 
  1872 static bool oop_offset_is_sane(const TypeInstPtr* tp) {
  1880 static bool oop_offset_is_sane(const TypeInstPtr* tp) {
  1873   ciInstanceKlass *k = tp->klass()->as_instance_klass();
  1881   ciInstanceKlass *k = tp->klass()->as_instance_klass();
  1874   // Make sure the offset goes inside the instance layout.
  1882   // Make sure the offset goes inside the instance layout.
  1876   // Note that OffsetBot and OffsetTop are very negative.
  1884   // Note that OffsetBot and OffsetTop are very negative.
  1877 }
  1885 }
  1878 
  1886 
  1879 //------------------------------final_graph_reshaping_impl----------------------
  1887 //------------------------------final_graph_reshaping_impl----------------------
  1880 // Implement items 1-5 from final_graph_reshaping below.
  1888 // Implement items 1-5 from final_graph_reshaping below.
  1881 static void final_graph_reshaping_impl( Node *n, Final_Reshape_Counts &fpu ) {
  1889 static void final_graph_reshaping_impl( Node *n, Final_Reshape_Counts &frc ) {
  1882 
  1890 
  1883   if ( n->outcnt() == 0 ) return; // dead node
  1891   if ( n->outcnt() == 0 ) return; // dead node
  1884   uint nop = n->Opcode();
  1892   uint nop = n->Opcode();
  1885 
  1893 
  1886   // Check for 2-input instruction with "last use" on right input.
  1894   // Check for 2-input instruction with "last use" on right input.
  1918   case Op_ConvI2F:
  1926   case Op_ConvI2F:
  1919   case Op_ConF:
  1927   case Op_ConF:
  1920   case Op_CmpF:
  1928   case Op_CmpF:
  1921   case Op_CmpF3:
  1929   case Op_CmpF3:
  1922   // case Op_ConvL2F: // longs are split into 32-bit halves
  1930   // case Op_ConvL2F: // longs are split into 32-bit halves
  1923     fpu.inc_float_count();
  1931     frc.inc_float_count();
  1924     break;
  1932     break;
  1925 
  1933 
  1926   case Op_ConvF2D:
  1934   case Op_ConvF2D:
  1927   case Op_ConvD2F:
  1935   case Op_ConvD2F:
  1928     fpu.inc_float_count();
  1936     frc.inc_float_count();
  1929     fpu.inc_double_count();
  1937     frc.inc_double_count();
  1930     break;
  1938     break;
  1931 
  1939 
  1932   // Count all double operations that may use FPU
  1940   // Count all double operations that may use FPU
  1933   case Op_AddD:
  1941   case Op_AddD:
  1934   case Op_SubD:
  1942   case Op_SubD:
  1941   // case Op_ConvL2D: // handled by leaf call
  1949   // case Op_ConvL2D: // handled by leaf call
  1942   // case Op_ConvD2L: // handled by leaf call
  1950   // case Op_ConvD2L: // handled by leaf call
  1943   case Op_ConD:
  1951   case Op_ConD:
  1944   case Op_CmpD:
  1952   case Op_CmpD:
  1945   case Op_CmpD3:
  1953   case Op_CmpD3:
  1946     fpu.inc_double_count();
  1954     frc.inc_double_count();
  1947     break;
  1955     break;
  1948   case Op_Opaque1:              // Remove Opaque Nodes before matching
  1956   case Op_Opaque1:              // Remove Opaque Nodes before matching
  1949   case Op_Opaque2:              // Remove Opaque Nodes before matching
  1957   case Op_Opaque2:              // Remove Opaque Nodes before matching
  1950     n->subsume_by(n->in(1));
  1958     n->subsume_by(n->in(1));
  1951     break;
  1959     break;
  1952   case Op_CallStaticJava:
  1960   case Op_CallStaticJava:
  1953   case Op_CallJava:
  1961   case Op_CallJava:
  1954   case Op_CallDynamicJava:
  1962   case Op_CallDynamicJava:
  1955     fpu.inc_java_call_count(); // Count java call site;
  1963     frc.inc_java_call_count(); // Count java call site;
  1956   case Op_CallRuntime:
  1964   case Op_CallRuntime:
  1957   case Op_CallLeaf:
  1965   case Op_CallLeaf:
  1958   case Op_CallLeafNoFP: {
  1966   case Op_CallLeafNoFP: {
  1959     assert( n->is_Call(), "" );
  1967     assert( n->is_Call(), "" );
  1960     CallNode *call = n->as_Call();
  1968     CallNode *call = n->as_Call();
  1961     // Count call sites where the FP mode bit would have to be flipped.
  1969     // Count call sites where the FP mode bit would have to be flipped.
  1962     // Do not count uncommon runtime calls:
  1970     // Do not count uncommon runtime calls:
  1963     // uncommon_trap, _complete_monitor_locking, _complete_monitor_unlocking,
  1971     // uncommon_trap, _complete_monitor_locking, _complete_monitor_unlocking,
  1964     // _new_Java, _new_typeArray, _new_objArray, _rethrow_Java, ...
  1972     // _new_Java, _new_typeArray, _new_objArray, _rethrow_Java, ...
  1965     if( !call->is_CallStaticJava() || !call->as_CallStaticJava()->_name ) {
  1973     if( !call->is_CallStaticJava() || !call->as_CallStaticJava()->_name ) {
  1966       fpu.inc_call_count();   // Count the call site
  1974       frc.inc_call_count();   // Count the call site
  1967     } else {                  // See if uncommon argument is shared
  1975     } else {                  // See if uncommon argument is shared
  1968       Node *n = call->in(TypeFunc::Parms);
  1976       Node *n = call->in(TypeFunc::Parms);
  1969       int nop = n->Opcode();
  1977       int nop = n->Opcode();
  1970       // Clone shared simple arguments to uncommon calls, item (1).
  1978       // Clone shared simple arguments to uncommon calls, item (1).
  1971       if( n->outcnt() > 1 &&
  1979       if( n->outcnt() > 1 &&
  1982   }
  1990   }
  1983 
  1991 
  1984   case Op_StoreD:
  1992   case Op_StoreD:
  1985   case Op_LoadD:
  1993   case Op_LoadD:
  1986   case Op_LoadD_unaligned:
  1994   case Op_LoadD_unaligned:
  1987     fpu.inc_double_count();
  1995     frc.inc_double_count();
  1988     goto handle_mem;
  1996     goto handle_mem;
  1989   case Op_StoreF:
  1997   case Op_StoreF:
  1990   case Op_LoadF:
  1998   case Op_LoadF:
  1991     fpu.inc_float_count();
  1999     frc.inc_float_count();
  1992     goto handle_mem;
  2000     goto handle_mem;
  1993 
  2001 
  1994   case Op_StoreB:
  2002   case Op_StoreB:
  1995   case Op_StoreC:
  2003   case Op_StoreC:
  1996   case Op_StoreCM:
  2004   case Op_StoreCM:
  2323       PackNode* p = (PackNode*) n;
  2331       PackNode* p = (PackNode*) n;
  2324       Node* btp = p->binaryTreePack(Compile::current(), 1, n->req());
  2332       Node* btp = p->binaryTreePack(Compile::current(), 1, n->req());
  2325       n->subsume_by(btp);
  2333       n->subsume_by(btp);
  2326     }
  2334     }
  2327     break;
  2335     break;
       
  2336   case Op_Loop:
       
  2337   case Op_CountedLoop:
       
  2338     if (n->as_Loop()->is_inner_loop()) {
       
  2339       frc.inc_inner_loop_count();
       
  2340     }
       
  2341     break;
  2328   default:
  2342   default:
  2329     assert( !n->is_Call(), "" );
  2343     assert( !n->is_Call(), "" );
  2330     assert( !n->is_Mem(), "" );
  2344     assert( !n->is_Mem(), "" );
  2331     break;
  2345     break;
  2332   }
  2346   }
  2333 
  2347 
  2334   // Collect CFG split points
  2348   // Collect CFG split points
  2335   if (n->is_MultiBranch())
  2349   if (n->is_MultiBranch())
  2336     fpu._tests.push(n);
  2350     frc._tests.push(n);
  2337 }
  2351 }
  2338 
  2352 
  2339 //------------------------------final_graph_reshaping_walk---------------------
  2353 //------------------------------final_graph_reshaping_walk---------------------
  2340 // Replacing Opaque nodes with their input in final_graph_reshaping_impl(),
  2354 // Replacing Opaque nodes with their input in final_graph_reshaping_impl(),
  2341 // requires that the walk visits a node's inputs before visiting the node.
  2355 // requires that the walk visits a node's inputs before visiting the node.
  2342 static void final_graph_reshaping_walk( Node_Stack &nstack, Node *root, Final_Reshape_Counts &fpu ) {
  2356 static void final_graph_reshaping_walk( Node_Stack &nstack, Node *root, Final_Reshape_Counts &frc ) {
  2343   ResourceArea *area = Thread::current()->resource_area();
  2357   ResourceArea *area = Thread::current()->resource_area();
  2344   Unique_Node_List sfpt(area);
  2358   Unique_Node_List sfpt(area);
  2345 
  2359 
  2346   fpu._visited.set(root->_idx); // first, mark node as visited
  2360   frc._visited.set(root->_idx); // first, mark node as visited
  2347   uint cnt = root->req();
  2361   uint cnt = root->req();
  2348   Node *n = root;
  2362   Node *n = root;
  2349   uint  i = 0;
  2363   uint  i = 0;
  2350   while (true) {
  2364   while (true) {
  2351     if (i < cnt) {
  2365     if (i < cnt) {
  2352       // Place all non-visited non-null inputs onto stack
  2366       // Place all non-visited non-null inputs onto stack
  2353       Node* m = n->in(i);
  2367       Node* m = n->in(i);
  2354       ++i;
  2368       ++i;
  2355       if (m != NULL && !fpu._visited.test_set(m->_idx)) {
  2369       if (m != NULL && !frc._visited.test_set(m->_idx)) {
  2356         if (m->is_SafePoint() && m->as_SafePoint()->jvms() != NULL)
  2370         if (m->is_SafePoint() && m->as_SafePoint()->jvms() != NULL)
  2357           sfpt.push(m);
  2371           sfpt.push(m);
  2358         cnt = m->req();
  2372         cnt = m->req();
  2359         nstack.push(n, i); // put on stack parent and next input's index
  2373         nstack.push(n, i); // put on stack parent and next input's index
  2360         n = m;
  2374         n = m;
  2361         i = 0;
  2375         i = 0;
  2362       }
  2376       }
  2363     } else {
  2377     } else {
  2364       // Now do post-visit work
  2378       // Now do post-visit work
  2365       final_graph_reshaping_impl( n, fpu );
  2379       final_graph_reshaping_impl( n, frc );
  2366       if (nstack.is_empty())
  2380       if (nstack.is_empty())
  2367         break;             // finished
  2381         break;             // finished
  2368       n = nstack.node();   // Get node from stack
  2382       n = nstack.node();   // Get node from stack
  2369       cnt = n->req();
  2383       cnt = n->req();
  2370       i = nstack.index();
  2384       i = nstack.index();
  2441   if (root()->req() == 1) {
  2455   if (root()->req() == 1) {
  2442     record_method_not_compilable("trivial infinite loop");
  2456     record_method_not_compilable("trivial infinite loop");
  2443     return true;
  2457     return true;
  2444   }
  2458   }
  2445 
  2459 
  2446   Final_Reshape_Counts fpu;
  2460   Final_Reshape_Counts frc;
  2447 
  2461 
  2448   // Visit everybody reachable!
  2462   // Visit everybody reachable!
  2449   // Allocate stack of size C->unique()/2 to avoid frequent realloc
  2463   // Allocate stack of size C->unique()/2 to avoid frequent realloc
  2450   Node_Stack nstack(unique() >> 1);
  2464   Node_Stack nstack(unique() >> 1);
  2451   final_graph_reshaping_walk(nstack, root(), fpu);
  2465   final_graph_reshaping_walk(nstack, root(), frc);
  2452 
  2466 
  2453   // Check for unreachable (from below) code (i.e., infinite loops).
  2467   // Check for unreachable (from below) code (i.e., infinite loops).
  2454   for( uint i = 0; i < fpu._tests.size(); i++ ) {
  2468   for( uint i = 0; i < frc._tests.size(); i++ ) {
  2455     MultiBranchNode *n = fpu._tests[i]->as_MultiBranch();
  2469     MultiBranchNode *n = frc._tests[i]->as_MultiBranch();
  2456     // Get number of CFG targets.
  2470     // Get number of CFG targets.
  2457     // Note that PCTables include exception targets after calls.
  2471     // Note that PCTables include exception targets after calls.
  2458     uint required_outcnt = n->required_outcnt();
  2472     uint required_outcnt = n->required_outcnt();
  2459     if (n->outcnt() != required_outcnt) {
  2473     if (n->outcnt() != required_outcnt) {
  2460       // Check for a few special cases.  Rethrow Nodes never take the
  2474       // Check for a few special cases.  Rethrow Nodes never take the
  2496       }
  2510       }
  2497     }
  2511     }
  2498     // Check that I actually visited all kids.  Unreached kids
  2512     // Check that I actually visited all kids.  Unreached kids
  2499     // must be infinite loops.
  2513     // must be infinite loops.
  2500     for (DUIterator_Fast jmax, j = n->fast_outs(jmax); j < jmax; j++)
  2514     for (DUIterator_Fast jmax, j = n->fast_outs(jmax); j < jmax; j++)
  2501       if (!fpu._visited.test(n->fast_out(j)->_idx)) {
  2515       if (!frc._visited.test(n->fast_out(j)->_idx)) {
  2502         record_method_not_compilable("infinite loop");
  2516         record_method_not_compilable("infinite loop");
  2503         return true;            // Found unvisited kid; must be unreach
  2517         return true;            // Found unvisited kid; must be unreach
  2504       }
  2518       }
  2505   }
  2519   }
  2506 
  2520 
  2507   // If original bytecodes contained a mixture of floats and doubles
  2521   // If original bytecodes contained a mixture of floats and doubles
  2508   // check if the optimizer has made it homogenous, item (3).
  2522   // check if the optimizer has made it homogenous, item (3).
  2509   if( Use24BitFPMode && Use24BitFP &&
  2523   if( Use24BitFPMode && Use24BitFP &&
  2510       fpu.get_float_count() > 32 &&
  2524       frc.get_float_count() > 32 &&
  2511       fpu.get_double_count() == 0 &&
  2525       frc.get_double_count() == 0 &&
  2512       (10 * fpu.get_call_count() < fpu.get_float_count()) ) {
  2526       (10 * frc.get_call_count() < frc.get_float_count()) ) {
  2513     set_24_bit_selection_and_mode( false,  true );
  2527     set_24_bit_selection_and_mode( false,  true );
  2514   }
  2528   }
  2515 
  2529 
  2516   set_has_java_calls(fpu.get_java_call_count() > 0);
  2530   set_java_calls(frc.get_java_call_count());
       
  2531   set_inner_loops(frc.get_inner_loop_count());
  2517 
  2532 
  2518   // No infinite loops, no reason to bail out.
  2533   // No infinite loops, no reason to bail out.
  2519   return false;
  2534   return false;
  2520 }
  2535 }
  2521 
  2536