src/share/vm/opto/phase.hpp

Tue, 15 Dec 2015 09:46:51 +0100

author
zmajo
date
Tue, 15 Dec 2015 09:46:51 +0100
changeset 8193
70649f10b88c
parent 7564
9df0d8f65fea
child 8604
04d83ba48607
permissions
-rw-r--r--

8129847: Compiling methods generated by Nashorn triggers high memory usage in C2
Summary: Add a new compiler phase, PhaseRenumberLive, that renumbers live nodes.
Reviewed-by: kvn, thartmann, vlivanov, shade

     1 /*
     2  * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    20  * or visit www.oracle.com if you need additional information or have any
    21  * questions.
    22  *
    23  */
    25 #ifndef SHARE_VM_OPTO_PHASE_HPP
    26 #define SHARE_VM_OPTO_PHASE_HPP
    28 #include "libadt/port.hpp"
    29 #include "runtime/timer.hpp"
    31 class Compile;
    33 //------------------------------Phase------------------------------------------
    34 // Most optimizations are done in Phases.  Creating a phase does any long
    35 // running analysis required, and caches the analysis in internal data
    36 // structures.  Later the analysis is queried using transform() calls to
    37 // guide transforming the program.  When the Phase is deleted, so is any
    38 // cached analysis info.  This basic Phase class mostly contains timing and
    39 // memory management code.
    40 class Phase : public StackObj {
    41 public:
    42   enum PhaseNumber {
    43     Compiler,                         // Top-level compiler phase
    44     Parser,                           // Parse bytecodes
    45     Remove_Useless,                   // Remove useless nodes
    46     Remove_Useless_And_Renumber_Live, // First, remove useless nodes from the graph. Then, renumber live nodes.
    47     Optimistic,                       // Optimistic analysis phase
    48     GVN,                              // Pessimistic global value numbering phase
    49     Ins_Select,                       // Instruction selection phase
    50     CFG,                              // Build a CFG
    51     BlockLayout,                      // Linear ordering of blocks
    52     Register_Allocation,              // Register allocation, duh
    53     LIVE,                             // Dragon-book LIVE range problem
    54     StringOpts,                       // StringBuilder related optimizations
    55     Interference_Graph,               // Building the IFG
    56     Coalesce,                         // Coalescing copies
    57     Ideal_Loop,                       // Find idealized trip-counted loops
    58     Macro_Expand,                     // Expand macro nodes
    59     Peephole,                         // Apply peephole optimizations
    60     last_phase
    61   };
    62 protected:
    63   enum PhaseNumber _pnum;       // Phase number (for stat gathering)
    65 #ifndef PRODUCT
    66   static int _total_bytes_compiled;
    68   // accumulated timers
    69   static elapsedTimer _t_totalCompilation;
    70   static elapsedTimer _t_methodCompilation;
    71   static elapsedTimer _t_stubCompilation;
    72 #endif
    74 // The next timers used for LogCompilation
    75   static elapsedTimer _t_parser;
    76   static elapsedTimer _t_optimizer;
    77 public:
    78   // ConnectionGraph can't be Phase since it is used after EA done.
    79   static elapsedTimer   _t_escapeAnalysis;
    80   static elapsedTimer     _t_connectionGraph;
    81 protected:
    82   static elapsedTimer   _t_idealLoop;
    83   static elapsedTimer   _t_ccp;
    84   static elapsedTimer _t_matcher;
    85   static elapsedTimer _t_registerAllocation;
    86   static elapsedTimer _t_output;
    88 #ifndef PRODUCT
    89   static elapsedTimer _t_graphReshaping;
    90   static elapsedTimer _t_scheduler;
    91   static elapsedTimer _t_blockOrdering;
    92   static elapsedTimer _t_macroEliminate;
    93   static elapsedTimer _t_macroExpand;
    94   static elapsedTimer _t_peephole;
    95   static elapsedTimer _t_postalloc_expand;
    96   static elapsedTimer _t_codeGeneration;
    97   static elapsedTimer _t_registerMethod;
    98   static elapsedTimer _t_temporaryTimer1;
    99   static elapsedTimer _t_temporaryTimer2;
   100   static elapsedTimer _t_idealLoopVerify;
   102 // Subtimers for _t_optimizer
   103   static elapsedTimer   _t_iterGVN;
   104   static elapsedTimer   _t_iterGVN2;
   105   static elapsedTimer   _t_incrInline;
   106   static elapsedTimer   _t_renumberLive;
   108 // Subtimers for _t_registerAllocation
   109   static elapsedTimer   _t_ctorChaitin;
   110   static elapsedTimer   _t_buildIFGphysical;
   111   static elapsedTimer   _t_computeLive;
   112   static elapsedTimer   _t_regAllocSplit;
   113   static elapsedTimer   _t_postAllocCopyRemoval;
   114   static elapsedTimer   _t_mergeMultidefs;
   115   static elapsedTimer   _t_fixupSpills;
   117 // Subtimers for _t_output
   118   static elapsedTimer   _t_instrSched;
   119   static elapsedTimer   _t_buildOopMaps;
   120 #endif
   121 public:
   122   Compile * C;
   123   Phase( PhaseNumber pnum );
   124 #ifndef PRODUCT
   125   static void print_timers();
   126 #endif
   127 };
   129 #endif // SHARE_VM_OPTO_PHASE_HPP

mercurial