src/share/vm/opto/cfgnode.hpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hotspot Sdiff src/share/vm/opto

src/share/vm/opto/cfgnode.hpp

Print this page
rev 9743 : 8139771: Eliminating CastPP nodes at Phis when they all come from a unique input may cause crash
Summary: Lost dependency when CastPP at Phis are eliminate
Reviewed-by:


 158   // create a new phi with narrowed memory type
 159   PhiNode* slice_memory(const TypePtr* adr_type) const;
 160   PhiNode* split_out_instance(const TypePtr* at, PhaseIterGVN *igvn) const;
 161   // like make(r, x), but does not initialize the in edges to x
 162   static PhiNode* make_blank( Node* r, Node* x );
 163 
 164   // Accessors
 165   RegionNode* region() const { Node* r = in(Region); assert(!r || r->is_Region(), ""); return (RegionNode*)r; }
 166 
 167   Node* is_copy() const {
 168     // The node is a real phi if _in[0] is a Region node.
 169     DEBUG_ONLY(const Node* r = _in[Region];)
 170     assert(r != NULL && r->is_Region(), "Not valid control");
 171     return NULL;  // not a copy!
 172   }
 173 
 174   bool is_tripcount() const;
 175 
 176   // Determine a unique non-trivial input, if any.
 177   // Ignore casts if it helps.  Return NULL on failure.
 178   Node* unique_input(PhaseTransform *phase);







 179 
 180   // Check for a simple dead loop.
 181   enum LoopSafety { Safe = 0, Unsafe, UnsafeLoop };
 182   LoopSafety simple_data_loop_check(Node *in) const;
 183   // Is it unsafe data loop? It becomes a dead loop if this phi node removed.
 184   bool is_unsafe_data_reference(Node *in) const;
 185   int  is_diamond_phi(bool check_control_only = false) const;
 186   virtual int Opcode() const;
 187   virtual bool pinned() const { return in(0) != 0; }
 188   virtual const TypePtr *adr_type() const { verify_adr_type(true); return _adr_type; }
 189 
 190   const int inst_id()     const { return _inst_id; }
 191   const int inst_index()  const { return _inst_index; }
 192   const int inst_offset() const { return _inst_offset; }
 193   bool is_same_inst_field(const Type* tp, int id, int index, int offset) {
 194     return type()->basic_type() == tp->basic_type() &&
 195            inst_id()     == id     &&
 196            inst_index()  == index  &&
 197            inst_offset() == offset &&
 198            type()->higher_equal(tp);




 158   // create a new phi with narrowed memory type
 159   PhiNode* slice_memory(const TypePtr* adr_type) const;
 160   PhiNode* split_out_instance(const TypePtr* at, PhaseIterGVN *igvn) const;
 161   // like make(r, x), but does not initialize the in edges to x
 162   static PhiNode* make_blank( Node* r, Node* x );
 163 
 164   // Accessors
 165   RegionNode* region() const { Node* r = in(Region); assert(!r || r->is_Region(), ""); return (RegionNode*)r; }
 166 
 167   Node* is_copy() const {
 168     // The node is a real phi if _in[0] is a Region node.
 169     DEBUG_ONLY(const Node* r = _in[Region];)
 170     assert(r != NULL && r->is_Region(), "Not valid control");
 171     return NULL;  // not a copy!
 172   }
 173 
 174   bool is_tripcount() const;
 175 
 176   // Determine a unique non-trivial input, if any.
 177   // Ignore casts if it helps.  Return NULL on failure.
 178   Node* unique_input(PhaseTransform *phase, bool uncast);
 179   Node* unique_input(PhaseTransform *phase) {
 180     Node* uin = unique_input(phase, false);
 181     if (uin == NULL) {
 182       uin = unique_input(phase, true);
 183     }
 184     return uin;
 185   }
 186 
 187   // Check for a simple dead loop.
 188   enum LoopSafety { Safe = 0, Unsafe, UnsafeLoop };
 189   LoopSafety simple_data_loop_check(Node *in) const;
 190   // Is it unsafe data loop? It becomes a dead loop if this phi node removed.
 191   bool is_unsafe_data_reference(Node *in) const;
 192   int  is_diamond_phi(bool check_control_only = false) const;
 193   virtual int Opcode() const;
 194   virtual bool pinned() const { return in(0) != 0; }
 195   virtual const TypePtr *adr_type() const { verify_adr_type(true); return _adr_type; }
 196 
 197   const int inst_id()     const { return _inst_id; }
 198   const int inst_index()  const { return _inst_index; }
 199   const int inst_offset() const { return _inst_offset; }
 200   bool is_same_inst_field(const Type* tp, int id, int index, int offset) {
 201     return type()->basic_type() == tp->basic_type() &&
 202            inst_id()     == id     &&
 203            inst_index()  == index  &&
 204            inst_offset() == offset &&
 205            type()->higher_equal(tp);


src/share/vm/opto/cfgnode.hpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File