1 /*
2  * Copyright (c) 1997, 2021, 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_OPTO_ROOTNODE_HPP
26 #define SHARE_OPTO_ROOTNODE_HPP
27 
28 #include "opto/loopnode.hpp"
29 
30 //------------------------------RootNode---------------------------------------
31 // The one-and-only before-all-else and after-all-else RootNode.  The RootNode
32 // represents what happens if the user runs the whole program repeatedly.  The
33 // RootNode produces the initial values of I/O and memory for the program or
34 // procedure start.
35 class RootNode : public LoopNode {
36 public:
RootNode()37   RootNode( ) : LoopNode(0,0) {
38     init_class_id(Class_Root);
39     del_req(2);
40     del_req(1);
41   }
42   virtual int   Opcode() const;
is_block_proj() const43   virtual const Node *is_block_proj() const { return this; }
bottom_type() const44   virtual const Type *bottom_type() const { return Type::BOTTOM; }
Identity(PhaseGVN * phase)45   virtual Node* Identity(PhaseGVN* phase) { return this; }
46   virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
Value(PhaseGVN * phase) const47   virtual const Type* Value(PhaseGVN* phase) const { return Type::BOTTOM; }
48 };
49 
50 //------------------------------HaltNode---------------------------------------
51 // Throw an exception & die
52 class HaltNode : public Node {
53 protected:
54   virtual uint size_of() const;
55 public:
56   const char* _halt_reason;
57   bool        _reachable;
58   HaltNode(Node* ctrl, Node* frameptr, const char* halt_reason, bool reachable = true);
59   virtual int Opcode() const;
pinned() const60   virtual bool  pinned() const { return true; };
61   virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
62   virtual const Type* Value(PhaseGVN* phase) const;
63   virtual const Type *bottom_type() const;
is_CFG() const64   virtual bool  is_CFG() const { return true; }
hash() const65   virtual uint hash() const { return NO_HASH; }  // CFG nodes do not hash
depends_only_on_test() const66   virtual bool depends_only_on_test() const { return false; }
is_block_proj() const67   virtual const Node *is_block_proj() const { return this; }
68   virtual const RegMask &out_RegMask() const;
ideal_reg() const69   virtual uint ideal_reg() const { return NotAMachineReg; }
match_edge(uint idx) const70   virtual uint match_edge(uint idx) const { return 0; }
71 
72 #ifndef PRODUCT
73   virtual void related(GrowableArray<Node*> *in_rel, GrowableArray<Node*> *out_rel, bool compact) const;
74 #endif
75 };
76 
77 #endif // SHARE_OPTO_ROOTNODE_HPP
78