Mercurial > hg > graal-compiler
comparison src/share/vm/opto/cfgnode.hpp @ 127:e0bd2e08e3d0
6663848: assert(i < Max(),"oob") in C2 with -Xcomp
Summary: NeverBranchNodes aren't handled properly
Reviewed-by: kvn, sgoldman, rasbold, jrose
author | never |
---|---|
date | Thu, 24 Apr 2008 11:13:03 -0700 |
parents | 2a9af0b9cb1c |
children | d1605aabd0a1 1dd146f17531 |
comparison
equal
deleted
inserted
replaced
126:72f4a668df19 | 127:e0bd2e08e3d0 |
---|---|
242 class MultiBranchNode : public MultiNode { | 242 class MultiBranchNode : public MultiNode { |
243 public: | 243 public: |
244 MultiBranchNode( uint required ) : MultiNode(required) { | 244 MultiBranchNode( uint required ) : MultiNode(required) { |
245 init_class_id(Class_MultiBranch); | 245 init_class_id(Class_MultiBranch); |
246 } | 246 } |
247 // returns required number of users to be well formed. | |
248 virtual int required_outcnt() const = 0; | |
247 }; | 249 }; |
248 | 250 |
249 //------------------------------IfNode----------------------------------------- | 251 //------------------------------IfNode----------------------------------------- |
250 // Output selected Control, based on a boolean test | 252 // Output selected Control, based on a boolean test |
251 class IfNode : public MultiBranchNode { | 253 class IfNode : public MultiBranchNode { |
331 virtual int Opcode() const; | 333 virtual int Opcode() const; |
332 virtual bool pinned() const { return true; } | 334 virtual bool pinned() const { return true; } |
333 virtual const Type *bottom_type() const { return TypeTuple::IFBOTH; } | 335 virtual const Type *bottom_type() const { return TypeTuple::IFBOTH; } |
334 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); | 336 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); |
335 virtual const Type *Value( PhaseTransform *phase ) const; | 337 virtual const Type *Value( PhaseTransform *phase ) const; |
338 virtual int required_outcnt() const { return 2; } | |
336 virtual const RegMask &out_RegMask() const; | 339 virtual const RegMask &out_RegMask() const; |
337 void dominated_by(Node* prev_dom, PhaseIterGVN* igvn); | 340 void dominated_by(Node* prev_dom, PhaseIterGVN* igvn); |
338 int is_range_check(Node* &range, Node* &index, jint &offset); | 341 int is_range_check(Node* &range, Node* &index, jint &offset); |
339 Node* fold_compares(PhaseGVN* phase); | 342 Node* fold_compares(PhaseGVN* phase); |
340 static Node* up_one_dom(Node* curr, bool linear_only = false); | 343 static Node* up_one_dom(Node* curr, bool linear_only = false); |
389 virtual int Opcode() const; | 392 virtual int Opcode() const; |
390 virtual const Type *Value( PhaseTransform *phase ) const; | 393 virtual const Type *Value( PhaseTransform *phase ) const; |
391 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); | 394 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); |
392 virtual const Type *bottom_type() const; | 395 virtual const Type *bottom_type() const; |
393 virtual bool pinned() const { return true; } | 396 virtual bool pinned() const { return true; } |
397 virtual int required_outcnt() const { return _size; } | |
394 }; | 398 }; |
395 | 399 |
396 //------------------------------JumpNode--------------------------------------- | 400 //------------------------------JumpNode--------------------------------------- |
397 // Indirect branch. Uses PCTable above to implement a switch statement. | 401 // Indirect branch. Uses PCTable above to implement a switch statement. |
398 // It emits as a table load and local branch. | 402 // It emits as a table load and local branch. |
502 public: | 506 public: |
503 NeverBranchNode( Node *ctrl ) : MultiBranchNode(1) { init_req(0,ctrl); } | 507 NeverBranchNode( Node *ctrl ) : MultiBranchNode(1) { init_req(0,ctrl); } |
504 virtual int Opcode() const; | 508 virtual int Opcode() const; |
505 virtual bool pinned() const { return true; }; | 509 virtual bool pinned() const { return true; }; |
506 virtual const Type *bottom_type() const { return TypeTuple::IFBOTH; } | 510 virtual const Type *bottom_type() const { return TypeTuple::IFBOTH; } |
507 | 511 virtual const Type *Value( PhaseTransform *phase ) const; |
512 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); | |
513 virtual int required_outcnt() const { return 2; } | |
508 virtual void emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const { } | 514 virtual void emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const { } |
509 virtual uint size(PhaseRegAlloc *ra_) const { return 0; } | 515 virtual uint size(PhaseRegAlloc *ra_) const { return 0; } |
510 #ifndef PRODUCT | 516 #ifndef PRODUCT |
511 virtual void format( PhaseRegAlloc *, outputStream *st ) const; | 517 virtual void format( PhaseRegAlloc *, outputStream *st ) const; |
512 #endif | 518 #endif |