src/hotspot/share/opto/multnode.hpp
changeset 47216 71c04702a3d5
parent 35551 36ef3841fb34
child 48595 5d699d81c10c
equal deleted inserted replaced
47215:4ebc2e2fb97c 47216:71c04702a3d5
       
     1 /*
       
     2  * Copyright (c) 1997, 2015, 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  */
       
    24 
       
    25 #ifndef SHARE_VM_OPTO_MULTNODE_HPP
       
    26 #define SHARE_VM_OPTO_MULTNODE_HPP
       
    27 
       
    28 #include "opto/node.hpp"
       
    29 
       
    30 class Matcher;
       
    31 class ProjNode;
       
    32 
       
    33 //------------------------------MultiNode--------------------------------------
       
    34 // This class defines a MultiNode, a Node which produces many values.  The
       
    35 // values are wrapped up in a tuple Type, i.e. a TypeTuple.
       
    36 class MultiNode : public Node {
       
    37 public:
       
    38   MultiNode( uint required ) : Node(required) {
       
    39     init_class_id(Class_Multi);
       
    40   }
       
    41   virtual int Opcode() const;
       
    42   virtual const Type *bottom_type() const = 0;
       
    43   virtual bool       is_CFG() const { return true; }
       
    44   virtual uint hash() const { return NO_HASH; }  // CFG nodes do not hash
       
    45   virtual bool depends_only_on_test() const { return false; }
       
    46   virtual const RegMask &out_RegMask() const;
       
    47   virtual Node *match( const ProjNode *proj, const Matcher *m );
       
    48   virtual uint ideal_reg() const { return NotAMachineReg; }
       
    49   ProjNode* proj_out(uint which_proj) const; // Get a named projection
       
    50 
       
    51 };
       
    52 
       
    53 //------------------------------ProjNode---------------------------------------
       
    54 // This class defines a Projection node.  Projections project a single element
       
    55 // out of a tuple (or Signature) type.  Only MultiNodes produce TypeTuple
       
    56 // results.
       
    57 class ProjNode : public Node {
       
    58 protected:
       
    59   virtual uint hash() const;
       
    60   virtual uint cmp( const Node &n ) const;
       
    61   virtual uint size_of() const;
       
    62   void check_con() const;       // Called from constructor.
       
    63   const Type* proj_type(const Type* t) const;
       
    64 
       
    65 public:
       
    66   ProjNode( Node *src, uint con, bool io_use = false )
       
    67     : Node( src ), _con(con), _is_io_use(io_use)
       
    68   {
       
    69     init_class_id(Class_Proj);
       
    70     // Optimistic setting. Need additional checks in Node::is_dead_loop_safe().
       
    71     if (con != TypeFunc::Memory || src->is_Start())
       
    72       init_flags(Flag_is_dead_loop_safe);
       
    73     debug_only(check_con());
       
    74   }
       
    75   const uint _con;              // The field in the tuple we are projecting
       
    76   const bool _is_io_use;        // Used to distinguish between the projections
       
    77                                 // used on the control and io paths from a macro node
       
    78   virtual int Opcode() const;
       
    79   virtual bool      is_CFG() const;
       
    80   virtual bool depends_only_on_test() const { return false; }
       
    81   virtual const Type *bottom_type() const;
       
    82   virtual const TypePtr *adr_type() const;
       
    83   virtual bool pinned() const;
       
    84   virtual const Type* Value(PhaseGVN* phase) const;
       
    85   virtual uint ideal_reg() const;
       
    86   virtual const RegMask &out_RegMask() const;
       
    87 
       
    88 #ifndef PRODUCT
       
    89   virtual void dump_spec(outputStream *st) const;
       
    90   virtual void dump_compact_spec(outputStream *st) const;
       
    91 #endif
       
    92 
       
    93   // Return uncommon trap call node if proj is for "proj->[region->..]call_uct"
       
    94   // NULL otherwise
       
    95   CallStaticJavaNode* is_uncommon_trap_proj(Deoptimization::DeoptReason reason);
       
    96   // Return uncommon trap call node for    "if(test)-> proj -> ...
       
    97   //                                                 |
       
    98   //                                                 V
       
    99   //                                             other_proj->[region->..]call_uct"
       
   100   // NULL otherwise
       
   101   CallStaticJavaNode* is_uncommon_trap_if_pattern(Deoptimization::DeoptReason reason);
       
   102 
       
   103   // Return other proj node when this is a If proj node
       
   104   ProjNode* other_if_proj() const;
       
   105 };
       
   106 
       
   107 #endif // SHARE_VM_OPTO_MULTNODE_HPP