1 /* 2 * Copyright (c) 1997, 2008, 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 class Matcher; 26 class ProjNode; 27 28 //------------------------------MultiNode-------------------------------------- 29 // This class defines a MultiNode, a Node which produces many values. The 30 // values are wrapped up in a tuple Type, i.e. a TypeTuple. 31 class MultiNode : public Node { 32 public: 33 MultiNode( uint required ) : Node(required) { 34 init_class_id(Class_Multi); 35 } 36 virtual int Opcode() const; 37 virtual const Type *bottom_type() const = 0; 38 virtual bool is_CFG() const { return true; } 39 virtual uint hash() const { return NO_HASH; } // CFG nodes do not hash 40 virtual bool depends_only_on_test() const { return false; } 41 virtual const RegMask &out_RegMask() const; 42 virtual Node *match( const ProjNode *proj, const Matcher *m ); 43 virtual uint ideal_reg() const { return NotAMachineReg; } 44 ProjNode* proj_out(uint which_proj) const; // Get a named projection 45 46 }; 47 48 //------------------------------ProjNode--------------------------------------- 49 // This class defines a Projection node. Projections project a single element 50 // out of a tuple (or Signature) type. Only MultiNodes produce TypeTuple 51 // results. 52 class ProjNode : public Node { 53 protected: 54 virtual uint hash() const; 55 virtual uint cmp( const Node &n ) const; 56 virtual uint size_of() const; 57 void check_con() const; // Called from constructor. 58 59 public: 60 ProjNode( Node *src, uint con, bool io_use = false ) 61 : Node( src ), _con(con), _is_io_use(io_use) 62 { 63 init_class_id(Class_Proj); 64 // Optimistic setting. Need additional checks in Node::is_dead_loop_safe(). 65 if (con != TypeFunc::Memory || src->is_Start()) 66 init_flags(Flag_is_dead_loop_safe); 67 debug_only(check_con()); 68 } 69 const uint _con; // The field in the tuple we are projecting 70 const bool _is_io_use; // Used to distinguish between the projections 71 // used on the control and io paths from a macro node 72 virtual int Opcode() const; 73 virtual bool is_CFG() const; 74 virtual bool depends_only_on_test() const { return false; } 75 virtual const Type *bottom_type() const; 76 virtual const TypePtr *adr_type() const; 77 virtual bool pinned() const; 78 virtual const Type *Value( PhaseTransform *phase ) const; 79 virtual uint ideal_reg() const; 80 virtual const RegMask &out_RegMask() const; 81 #ifndef PRODUCT 82 virtual void dump_spec(outputStream *st) const; 83 #endif 84 };