1 /*
2  * Copyright (c) 1997, 2019, 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_CFGNODE_HPP
26 #define SHARE_OPTO_CFGNODE_HPP
27 
28 #include "opto/multnode.hpp"
29 #include "opto/node.hpp"
30 #include "opto/opcodes.hpp"
31 #include "opto/type.hpp"
32 
33 // Portions of code courtesy of Clifford Click
34 
35 // Optimization - Graph Style
36 
37 class Matcher;
38 class Node;
39 class   RegionNode;
40 class   TypeNode;
41 class     PhiNode;
42 class   GotoNode;
43 class   MultiNode;
44 class     MultiBranchNode;
45 class       IfNode;
46 class       PCTableNode;
47 class         JumpNode;
48 class         CatchNode;
49 class       NeverBranchNode;
50 class   ProjNode;
51 class     CProjNode;
52 class       IfTrueNode;
53 class       IfFalseNode;
54 class       CatchProjNode;
55 class     JProjNode;
56 class       JumpProjNode;
57 class     SCMemProjNode;
58 class PhaseIdealLoop;
59 
60 //------------------------------RegionNode-------------------------------------
61 // The class of RegionNodes, which can be mapped to basic blocks in the
62 // program.  Their inputs point to Control sources.  PhiNodes (described
63 // below) have an input point to a RegionNode.  Merged data inputs to PhiNodes
64 // correspond 1-to-1 with RegionNode inputs.  The zero input of a PhiNode is
65 // the RegionNode, and the zero input of the RegionNode is itself.
66 class RegionNode : public Node {
67 public:
68   // Node layout (parallels PhiNode):
69   enum { Region,                // Generally points to self.
70          Control                // Control arcs are [1..len)
71   };
72 
RegionNode(uint required)73   RegionNode( uint required ) : Node(required) {
74     init_class_id(Class_Region);
75     init_req(0,this);
76   }
77 
is_copy() const78   Node* is_copy() const {
79     const Node* r = _in[Region];
80     if (r == NULL)
81       return nonnull_req();
82     return NULL;  // not a copy!
83   }
84   PhiNode* has_phi() const;        // returns an arbitrary phi user, or NULL
85   PhiNode* has_unique_phi() const; // returns the unique phi user, or NULL
86   // Is this region node unreachable from root?
87   bool is_unreachable_region(PhaseGVN *phase) const;
88   virtual int Opcode() const;
pinned() const89   virtual bool pinned() const { return (const Node *)in(0) == this; }
is_CFG() const90   virtual bool  is_CFG   () const { return true; }
hash() const91   virtual uint hash() const { return NO_HASH; }  // CFG nodes do not hash
depends_only_on_test() const92   virtual bool depends_only_on_test() const { return false; }
bottom_type() const93   virtual const Type *bottom_type() const { return Type::CONTROL; }
94   virtual const Type* Value(PhaseGVN* phase) const;
95   virtual Node* Identity(PhaseGVN* phase);
96   virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
97   virtual const RegMask &out_RegMask() const;
98   bool try_clean_mem_phi(PhaseGVN *phase);
99   bool optimize_trichotomy(PhaseIterGVN* igvn);
100 };
101 
102 //------------------------------JProjNode--------------------------------------
103 // jump projection for node that produces multiple control-flow paths
104 class JProjNode : public ProjNode {
105  public:
JProjNode(Node * ctrl,uint idx)106   JProjNode( Node* ctrl, uint idx ) : ProjNode(ctrl,idx) {}
107   virtual int Opcode() const;
is_CFG() const108   virtual bool  is_CFG() const { return true; }
hash() const109   virtual uint  hash() const { return NO_HASH; }  // CFG nodes do not hash
is_block_proj() const110   virtual const Node* is_block_proj() const { return in(0); }
111   virtual const RegMask& out_RegMask() const;
ideal_reg() const112   virtual uint  ideal_reg() const { return 0; }
113 };
114 
115 //------------------------------PhiNode----------------------------------------
116 // PhiNodes merge values from different Control paths.  Slot 0 points to the
117 // controlling RegionNode.  Other slots map 1-for-1 with incoming control flow
118 // paths to the RegionNode.  For speed reasons (to avoid another pass) we
119 // can turn PhiNodes into copys in-place by NULL'ing out their RegionNode
120 // input in slot 0.
121 class PhiNode : public TypeNode {
122   friend class PhaseRenumberLive;
123 
124   const TypePtr* const _adr_type; // non-null only for Type::MEMORY nodes.
125   // The following fields are only used for data PhiNodes to indicate
126   // that the PhiNode represents the value of a known instance field.
127         int _inst_mem_id; // Instance memory id (node index of the memory Phi)
128         int _inst_id;     // Instance id of the memory slice.
129   const int _inst_index;  // Alias index of the instance memory slice.
130   // Array elements references have the same alias_idx but different offset.
131   const int _inst_offset; // Offset of the instance memory slice.
132   // Size is bigger to hold the _adr_type field.
133   virtual uint hash() const;    // Check the type
134   virtual bool cmp( const Node &n ) const;
size_of() const135   virtual uint size_of() const { return sizeof(*this); }
136 
137   // Determine if CMoveNode::is_cmove_id can be used at this join point.
138   Node* is_cmove_id(PhaseTransform* phase, int true_path);
139 
140 public:
141   // Node layout (parallels RegionNode):
142   enum { Region,                // Control input is the Phi's region.
143          Input                  // Input values are [1..len)
144   };
145 
PhiNode(Node * r,const Type * t,const TypePtr * at=NULL,const int imid=-1,const int iid=TypeOopPtr::InstanceTop,const int iidx=Compile::AliasIdxTop,const int ioffs=Type::OffsetTop)146   PhiNode( Node *r, const Type *t, const TypePtr* at = NULL,
147            const int imid = -1,
148            const int iid = TypeOopPtr::InstanceTop,
149            const int iidx = Compile::AliasIdxTop,
150            const int ioffs = Type::OffsetTop )
151     : TypeNode(t,r->req()),
152       _adr_type(at),
153       _inst_mem_id(imid),
154       _inst_id(iid),
155       _inst_index(iidx),
156       _inst_offset(ioffs)
157   {
158     init_class_id(Class_Phi);
159     init_req(0, r);
160     verify_adr_type();
161   }
162   // create a new phi with in edges matching r and set (initially) to x
163   static PhiNode* make( Node* r, Node* x );
164   // extra type arguments override the new phi's bottom_type and adr_type
165   static PhiNode* make( Node* r, Node* x, const Type *t, const TypePtr* at = NULL );
166   // create a new phi with narrowed memory type
167   PhiNode* slice_memory(const TypePtr* adr_type) const;
168   PhiNode* split_out_instance(const TypePtr* at, PhaseIterGVN *igvn) const;
169   // like make(r, x), but does not initialize the in edges to x
170   static PhiNode* make_blank( Node* r, Node* x );
171 
172   // Accessors
region() const173   RegionNode* region() const { Node* r = in(Region); assert(!r || r->is_Region(), ""); return (RegionNode*)r; }
174 
is_copy() const175   Node* is_copy() const {
176     // The node is a real phi if _in[0] is a Region node.
177     DEBUG_ONLY(const Node* r = _in[Region];)
178     assert(r != NULL && r->is_Region(), "Not valid control");
179     return NULL;  // not a copy!
180   }
181 
182   bool is_tripcount() const;
183 
184   // Determine a unique non-trivial input, if any.
185   // Ignore casts if it helps.  Return NULL on failure.
186   Node* unique_input(PhaseTransform *phase, bool uncast);
unique_input(PhaseTransform * phase)187   Node* unique_input(PhaseTransform *phase) {
188     Node* uin = unique_input(phase, false);
189     if (uin == NULL) {
190       uin = unique_input(phase, true);
191     }
192     return uin;
193   }
194 
195   // Check for a simple dead loop.
196   enum LoopSafety { Safe = 0, Unsafe, UnsafeLoop };
197   LoopSafety simple_data_loop_check(Node *in) const;
198   // Is it unsafe data loop? It becomes a dead loop if this phi node removed.
199   bool is_unsafe_data_reference(Node *in) const;
200   int  is_diamond_phi(bool check_control_only = false) const;
201   virtual int Opcode() const;
pinned() const202   virtual bool pinned() const { return in(0) != 0; }
adr_type() const203   virtual const TypePtr *adr_type() const { verify_adr_type(true); return _adr_type; }
204 
set_inst_mem_id(int inst_mem_id)205   void  set_inst_mem_id(int inst_mem_id) { _inst_mem_id = inst_mem_id; }
inst_mem_id() const206   const int inst_mem_id() const { return _inst_mem_id; }
inst_id() const207   const int inst_id()     const { return _inst_id; }
inst_index() const208   const int inst_index()  const { return _inst_index; }
inst_offset() const209   const int inst_offset() const { return _inst_offset; }
is_same_inst_field(const Type * tp,int mem_id,int id,int index,int offset)210   bool is_same_inst_field(const Type* tp, int mem_id, int id, int index, int offset) {
211     return type()->basic_type() == tp->basic_type() &&
212            inst_mem_id() == mem_id &&
213            inst_id()     == id     &&
214            inst_index()  == index  &&
215            inst_offset() == offset &&
216            type()->higher_equal(tp);
217   }
218 
219   virtual const Type* Value(PhaseGVN* phase) const;
220   virtual Node* Identity(PhaseGVN* phase);
221   virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
222   virtual const RegMask &out_RegMask() const;
223   virtual const RegMask &in_RegMask(uint) const;
224 #ifndef PRODUCT
225   virtual void related(GrowableArray<Node*> *in_rel, GrowableArray<Node*> *out_rel, bool compact) const;
226   virtual void dump_spec(outputStream *st) const;
227 #endif
228 #ifdef ASSERT
229   void verify_adr_type(VectorSet& visited, const TypePtr* at) const;
230   void verify_adr_type(bool recursive = false) const;
231 #else //ASSERT
verify_adr_type(bool recursive=false) const232   void verify_adr_type(bool recursive = false) const {}
233 #endif //ASSERT
234 };
235 
236 //------------------------------GotoNode---------------------------------------
237 // GotoNodes perform direct branches.
238 class GotoNode : public Node {
239 public:
GotoNode(Node * control)240   GotoNode( Node *control ) : Node(control) {}
241   virtual int Opcode() const;
pinned() const242   virtual bool pinned() const { return true; }
is_CFG() const243   virtual bool  is_CFG() const { return true; }
hash() const244   virtual uint hash() const { return NO_HASH; }  // CFG nodes do not hash
is_block_proj() const245   virtual const Node *is_block_proj() const { return this; }
depends_only_on_test() const246   virtual bool depends_only_on_test() const { return false; }
bottom_type() const247   virtual const Type *bottom_type() const { return Type::CONTROL; }
248   virtual const Type* Value(PhaseGVN* phase) const;
249   virtual Node* Identity(PhaseGVN* phase);
250   virtual const RegMask &out_RegMask() const;
251 
252 #ifndef PRODUCT
253   virtual void related(GrowableArray<Node*> *in_rel, GrowableArray<Node*> *out_rel, bool compact) const;
254 #endif
255 };
256 
257 //------------------------------CProjNode--------------------------------------
258 // control projection for node that produces multiple control-flow paths
259 class CProjNode : public ProjNode {
260 public:
CProjNode(Node * ctrl,uint idx)261   CProjNode( Node *ctrl, uint idx ) : ProjNode(ctrl,idx) {}
262   virtual int Opcode() const;
is_CFG() const263   virtual bool  is_CFG() const { return true; }
hash() const264   virtual uint hash() const { return NO_HASH; }  // CFG nodes do not hash
is_block_proj() const265   virtual const Node *is_block_proj() const { return in(0); }
266   virtual const RegMask &out_RegMask() const;
ideal_reg() const267   virtual uint ideal_reg() const { return 0; }
268 };
269 
270 //---------------------------MultiBranchNode-----------------------------------
271 // This class defines a MultiBranchNode, a MultiNode which yields multiple
272 // control values. These are distinguished from other types of MultiNodes
273 // which yield multiple values, but control is always and only projection #0.
274 class MultiBranchNode : public MultiNode {
275 public:
MultiBranchNode(uint required)276   MultiBranchNode( uint required ) : MultiNode(required) {
277     init_class_id(Class_MultiBranch);
278   }
279   // returns required number of users to be well formed.
280   virtual int required_outcnt() const = 0;
281 };
282 
283 //------------------------------IfNode-----------------------------------------
284 // Output selected Control, based on a boolean test
285 class IfNode : public MultiBranchNode {
286   // Size is bigger to hold the probability field.  However, _prob does not
287   // change the semantics so it does not appear in the hash & cmp functions.
size_of() const288   virtual uint size_of() const { return sizeof(*this); }
289 
290 private:
291   // Helper methods for fold_compares
292   bool cmpi_folds(PhaseIterGVN* igvn);
293   bool is_ctrl_folds(Node* ctrl, PhaseIterGVN* igvn);
294   bool has_shared_region(ProjNode* proj, ProjNode*& success, ProjNode*& fail);
295   bool has_only_uncommon_traps(ProjNode* proj, ProjNode*& success, ProjNode*& fail, PhaseIterGVN* igvn);
296   Node* merge_uncommon_traps(ProjNode* proj, ProjNode* success, ProjNode* fail, PhaseIterGVN* igvn);
297   static void improve_address_types(Node* l, Node* r, ProjNode* fail, PhaseIterGVN* igvn);
298   bool is_cmp_with_loadrange(ProjNode* proj);
299   bool is_null_check(ProjNode* proj, PhaseIterGVN* igvn);
300   bool is_side_effect_free_test(ProjNode* proj, PhaseIterGVN* igvn);
301   void reroute_side_effect_free_unc(ProjNode* proj, ProjNode* dom_proj, PhaseIterGVN* igvn);
302   ProjNode* uncommon_trap_proj(CallStaticJavaNode*& call) const;
303   bool fold_compares_helper(ProjNode* proj, ProjNode* success, ProjNode* fail, PhaseIterGVN* igvn);
304   static bool is_dominator_unc(CallStaticJavaNode* dom_unc, CallStaticJavaNode* unc);
305 
306 protected:
307   ProjNode* range_check_trap_proj(int& flip, Node*& l, Node*& r);
308   Node* Ideal_common(PhaseGVN *phase, bool can_reshape);
309   Node* search_identical(int dist);
310 
311 public:
312 
313   // Degrees of branch prediction probability by order of magnitude:
314   // PROB_UNLIKELY_1e(N) is a 1 in 1eN chance.
315   // PROB_LIKELY_1e(N) is a 1 - PROB_UNLIKELY_1e(N)
316 #define PROB_UNLIKELY_MAG(N)    (1e- ## N ## f)
317 #define PROB_LIKELY_MAG(N)      (1.0f-PROB_UNLIKELY_MAG(N))
318 
319   // Maximum and minimum branch prediction probabilties
320   // 1 in 1,000,000 (magnitude 6)
321   //
322   // Although PROB_NEVER == PROB_MIN and PROB_ALWAYS == PROB_MAX
323   // they are used to distinguish different situations:
324   //
325   // The name PROB_MAX (PROB_MIN) is for probabilities which correspond to
326   // very likely (unlikely) but with a concrete possibility of a rare
327   // contrary case.  These constants would be used for pinning
328   // measurements, and as measures for assertions that have high
329   // confidence, but some evidence of occasional failure.
330   //
331   // The name PROB_ALWAYS (PROB_NEVER) is to stand for situations for which
332   // there is no evidence at all that the contrary case has ever occurred.
333 
334 #define PROB_NEVER              PROB_UNLIKELY_MAG(6)
335 #define PROB_ALWAYS             PROB_LIKELY_MAG(6)
336 
337 #define PROB_MIN                PROB_UNLIKELY_MAG(6)
338 #define PROB_MAX                PROB_LIKELY_MAG(6)
339 
340   // Static branch prediction probabilities
341   // 1 in 10 (magnitude 1)
342 #define PROB_STATIC_INFREQUENT  PROB_UNLIKELY_MAG(1)
343 #define PROB_STATIC_FREQUENT    PROB_LIKELY_MAG(1)
344 
345   // Fair probability 50/50
346 #define PROB_FAIR               (0.5f)
347 
348   // Unknown probability sentinel
349 #define PROB_UNKNOWN            (-1.0f)
350 
351   // Probability "constructors", to distinguish as a probability any manifest
352   // constant without a names
353 #define PROB_LIKELY(x)          ((float) (x))
354 #define PROB_UNLIKELY(x)        (1.0f - (float)(x))
355 
356   // Other probabilities in use, but without a unique name, are documented
357   // here for lack of a better place:
358   //
359   // 1 in 1000 probabilities (magnitude 3):
360   //     threshold for converting to conditional move
361   //     likelihood of null check failure if a null HAS been seen before
362   //     likelihood of slow path taken in library calls
363   //
364   // 1 in 10,000 probabilities (magnitude 4):
365   //     threshold for making an uncommon trap probability more extreme
366   //     threshold for for making a null check implicit
367   //     likelihood of needing a gc if eden top moves during an allocation
368   //     likelihood of a predicted call failure
369   //
370   // 1 in 100,000 probabilities (magnitude 5):
371   //     threshold for ignoring counts when estimating path frequency
372   //     likelihood of FP clipping failure
373   //     likelihood of catching an exception from a try block
374   //     likelihood of null check failure if a null has NOT been seen before
375   //
376   // Magic manifest probabilities such as 0.83, 0.7, ... can be found in
377   // gen_subtype_check() and catch_inline_exceptions().
378 
379   float _prob;                  // Probability of true path being taken.
380   float _fcnt;                  // Frequency counter
IfNode(Node * control,Node * b,float p,float fcnt)381   IfNode( Node *control, Node *b, float p, float fcnt )
382     : MultiBranchNode(2), _prob(p), _fcnt(fcnt) {
383     init_class_id(Class_If);
384     init_req(0,control);
385     init_req(1,b);
386   }
387   virtual int Opcode() const;
pinned() const388   virtual bool pinned() const { return true; }
bottom_type() const389   virtual const Type *bottom_type() const { return TypeTuple::IFBOTH; }
390   virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
391   virtual const Type* Value(PhaseGVN* phase) const;
required_outcnt() const392   virtual int required_outcnt() const { return 2; }
393   virtual const RegMask &out_RegMask() const;
394   Node* fold_compares(PhaseIterGVN* phase);
395   static Node* up_one_dom(Node* curr, bool linear_only = false);
396   Node* dominated_by(Node* prev_dom, PhaseIterGVN* igvn);
397 
398   // Takes the type of val and filters it through the test represented
399   // by if_proj and returns a more refined type if one is produced.
400   // Returns NULL is it couldn't improve the type.
401   static const TypeInt* filtered_int_type(PhaseGVN* phase, Node* val, Node* if_proj);
402 
403 #ifndef PRODUCT
404   virtual void dump_spec(outputStream *st) const;
405   virtual void related(GrowableArray <Node *> *in_rel, GrowableArray <Node *> *out_rel, bool compact) const;
406 #endif
407 };
408 
409 class RangeCheckNode : public IfNode {
410 private:
411   int is_range_check(Node* &range, Node* &index, jint &offset);
412 
413 public:
RangeCheckNode(Node * control,Node * b,float p,float fcnt)414   RangeCheckNode(Node* control, Node *b, float p, float fcnt)
415     : IfNode(control, b, p, fcnt) {
416     init_class_id(Class_RangeCheck);
417   }
418 
419   virtual int Opcode() const;
420   virtual Node* Ideal(PhaseGVN *phase, bool can_reshape);
421 };
422 
423 class IfProjNode : public CProjNode {
424 public:
IfProjNode(IfNode * ifnode,uint idx)425   IfProjNode(IfNode *ifnode, uint idx) : CProjNode(ifnode,idx) {}
426   virtual Node* Identity(PhaseGVN* phase);
427 
428 protected:
429   // Type of If input when this branch is always taken
430   virtual bool always_taken(const TypeTuple* t) const = 0;
431 
432 #ifndef PRODUCT
433 public:
434   virtual void related(GrowableArray<Node*> *in_rel, GrowableArray<Node*> *out_rel, bool compact) const;
435 #endif
436 };
437 
438 class IfTrueNode : public IfProjNode {
439 public:
IfTrueNode(IfNode * ifnode)440   IfTrueNode( IfNode *ifnode ) : IfProjNode(ifnode,1) {
441     init_class_id(Class_IfTrue);
442   }
443   virtual int Opcode() const;
444 
445 protected:
always_taken(const TypeTuple * t) const446   virtual bool always_taken(const TypeTuple* t) const { return t == TypeTuple::IFTRUE; }
447 };
448 
449 class IfFalseNode : public IfProjNode {
450 public:
IfFalseNode(IfNode * ifnode)451   IfFalseNode( IfNode *ifnode ) : IfProjNode(ifnode,0) {
452     init_class_id(Class_IfFalse);
453   }
454   virtual int Opcode() const;
455 
456 protected:
always_taken(const TypeTuple * t) const457   virtual bool always_taken(const TypeTuple* t) const { return t == TypeTuple::IFFALSE; }
458 };
459 
460 
461 //------------------------------PCTableNode------------------------------------
462 // Build an indirect branch table.  Given a control and a table index,
463 // control is passed to the Projection matching the table index.  Used to
464 // implement switch statements and exception-handling capabilities.
465 // Undefined behavior if passed-in index is not inside the table.
466 class PCTableNode : public MultiBranchNode {
467   virtual uint hash() const;    // Target count; table size
468   virtual bool cmp( const Node &n ) const;
size_of() const469   virtual uint size_of() const { return sizeof(*this); }
470 
471 public:
472   const uint _size;             // Number of targets
473 
PCTableNode(Node * ctrl,Node * idx,uint size)474   PCTableNode( Node *ctrl, Node *idx, uint size ) : MultiBranchNode(2), _size(size) {
475     init_class_id(Class_PCTable);
476     init_req(0, ctrl);
477     init_req(1, idx);
478   }
479   virtual int Opcode() const;
480   virtual const Type* Value(PhaseGVN* phase) const;
481   virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
482   virtual const Type *bottom_type() const;
pinned() const483   virtual bool pinned() const { return true; }
required_outcnt() const484   virtual int required_outcnt() const { return _size; }
485 };
486 
487 //------------------------------JumpNode---------------------------------------
488 // Indirect branch.  Uses PCTable above to implement a switch statement.
489 // It emits as a table load and local branch.
490 class JumpNode : public PCTableNode {
size_of() const491   virtual uint size_of() const { return sizeof(*this); }
492 public:
493   float* _probs; // probability of each projection
494   float _fcnt;   // total number of times this Jump was executed
JumpNode(Node * control,Node * switch_val,uint size,float * probs,float cnt)495   JumpNode( Node* control, Node* switch_val, uint size, float* probs, float cnt)
496     : PCTableNode(control, switch_val, size),
497       _probs(probs), _fcnt(cnt) {
498     init_class_id(Class_Jump);
499   }
500   virtual int   Opcode() const;
501   virtual const RegMask& out_RegMask() const;
is_block_proj() const502   virtual const Node* is_block_proj() const { return this; }
503 #ifndef PRODUCT
504   virtual void related(GrowableArray<Node*> *in_rel, GrowableArray<Node*> *out_rel, bool compact) const;
505 #endif
506 };
507 
508 class JumpProjNode : public JProjNode {
509   virtual uint hash() const;
510   virtual bool cmp( const Node &n ) const;
size_of() const511   virtual uint size_of() const { return sizeof(*this); }
512 
513  private:
514   const int  _dest_bci;
515   const uint _proj_no;
516   const int  _switch_val;
517  public:
JumpProjNode(Node * jumpnode,uint proj_no,int dest_bci,int switch_val)518   JumpProjNode(Node* jumpnode, uint proj_no, int dest_bci, int switch_val)
519     : JProjNode(jumpnode, proj_no), _dest_bci(dest_bci), _proj_no(proj_no), _switch_val(switch_val) {
520     init_class_id(Class_JumpProj);
521   }
522 
523   virtual int Opcode() const;
bottom_type() const524   virtual const Type* bottom_type() const { return Type::CONTROL; }
dest_bci() const525   int  dest_bci()    const { return _dest_bci; }
switch_val() const526   int  switch_val()  const { return _switch_val; }
proj_no() const527   uint proj_no()     const { return _proj_no; }
528 #ifndef PRODUCT
529   virtual void dump_spec(outputStream *st) const;
530   virtual void dump_compact_spec(outputStream *st) const;
531   virtual void related(GrowableArray<Node*> *in_rel, GrowableArray<Node*> *out_rel, bool compact) const;
532 #endif
533 };
534 
535 //------------------------------CatchNode--------------------------------------
536 // Helper node to fork exceptions.  "Catch" catches any exceptions thrown by
537 // a just-prior call.  Looks like a PCTableNode but emits no code - just the
538 // table.  The table lookup and branch is implemented by RethrowNode.
539 class CatchNode : public PCTableNode {
540 public:
CatchNode(Node * ctrl,Node * idx,uint size)541   CatchNode( Node *ctrl, Node *idx, uint size ) : PCTableNode(ctrl,idx,size){
542     init_class_id(Class_Catch);
543   }
544   virtual int Opcode() const;
545   virtual const Type* Value(PhaseGVN* phase) const;
546 };
547 
548 // CatchProjNode controls which exception handler is targetted after a call.
549 // It is passed in the bci of the target handler, or no_handler_bci in case
550 // the projection doesn't lead to an exception handler.
551 class CatchProjNode : public CProjNode {
552   virtual uint hash() const;
553   virtual bool cmp( const Node &n ) const;
size_of() const554   virtual uint size_of() const { return sizeof(*this); }
555 
556 private:
557   const int _handler_bci;
558 
559 public:
560   enum {
561     fall_through_index =  0,      // the fall through projection index
562     catch_all_index    =  1,      // the projection index for catch-alls
563     no_handler_bci     = -1       // the bci for fall through or catch-all projs
564   };
565 
CatchProjNode(Node * catchnode,uint proj_no,int handler_bci)566   CatchProjNode(Node* catchnode, uint proj_no, int handler_bci)
567     : CProjNode(catchnode, proj_no), _handler_bci(handler_bci) {
568     init_class_id(Class_CatchProj);
569     assert(proj_no != fall_through_index || handler_bci < 0, "fall through case must have bci < 0");
570   }
571 
572   virtual int Opcode() const;
573   virtual Node* Identity(PhaseGVN* phase);
bottom_type() const574   virtual const Type *bottom_type() const { return Type::CONTROL; }
handler_bci() const575   int  handler_bci() const        { return _handler_bci; }
is_handler_proj() const576   bool is_handler_proj() const    { return _handler_bci >= 0; }
577 #ifndef PRODUCT
578   virtual void dump_spec(outputStream *st) const;
579 #endif
580 };
581 
582 
583 //---------------------------------CreateExNode--------------------------------
584 // Helper node to create the exception coming back from a call
585 class CreateExNode : public TypeNode {
586 public:
CreateExNode(const Type * t,Node * control,Node * i_o)587   CreateExNode(const Type* t, Node* control, Node* i_o) : TypeNode(t, 2) {
588     init_req(0, control);
589     init_req(1, i_o);
590   }
591   virtual int Opcode() const;
592   virtual Node* Identity(PhaseGVN* phase);
pinned() const593   virtual bool pinned() const { return true; }
match_edge(uint idx) const594   uint match_edge(uint idx) const { return 0; }
ideal_reg() const595   virtual uint ideal_reg() const { return Op_RegP; }
596 };
597 
598 //------------------------------NeverBranchNode-------------------------------
599 // The never-taken branch.  Used to give the appearance of exiting infinite
600 // loops to those algorithms that like all paths to be reachable.  Encodes
601 // empty.
602 class NeverBranchNode : public MultiBranchNode {
603 public:
NeverBranchNode(Node * ctrl)604   NeverBranchNode( Node *ctrl ) : MultiBranchNode(1) { init_req(0,ctrl); }
605   virtual int Opcode() const;
pinned() const606   virtual bool pinned() const { return true; };
bottom_type() const607   virtual const Type *bottom_type() const { return TypeTuple::IFBOTH; }
608   virtual const Type* Value(PhaseGVN* phase) const;
609   virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
required_outcnt() const610   virtual int required_outcnt() const { return 2; }
emit(CodeBuffer & cbuf,PhaseRegAlloc * ra_) const611   virtual void emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const { }
size(PhaseRegAlloc * ra_) const612   virtual uint size(PhaseRegAlloc *ra_) const { return 0; }
613 #ifndef PRODUCT
614   virtual void format( PhaseRegAlloc *, outputStream *st ) const;
615 #endif
616 };
617 
618 #endif // SHARE_OPTO_CFGNODE_HPP
619