43 Node* Opaque1Node::Identity(PhaseGVN* phase) {
44 return phase->C->major_progress() ? this : in(1);
45 }
46
47 //=============================================================================
48 // A node to prevent unwanted optimizations. Allows constant folding. Stops
49 // value-numbering, most Ideal calls or Identity functions. This Node is
50 // specifically designed to prevent the pre-increment value of a loop trip
51 // counter from being live out of the bottom of the loop (hence causing the
52 // pre- and post-increment values both being live and thus requiring an extra
53 // temp register and an extra move). If we "accidentally" optimize through
54 // this kind of a Node, we'll get slightly pessimal, but correct, code. Thus
55 // it's OK to be slightly sloppy on optimizations here.
56
57 // Do not allow value-numbering
58 uint Opaque2Node::hash() const { return NO_HASH; }
59 uint Opaque2Node::cmp( const Node &n ) const {
60 return (&n == this); // Always fail except on self
61 }
62
63 //=============================================================================
64
65 uint ProfileBooleanNode::hash() const { return NO_HASH; }
66 uint ProfileBooleanNode::cmp( const Node &n ) const {
67 return (&n == this);
68 }
69
70 Node *ProfileBooleanNode::Ideal(PhaseGVN *phase, bool can_reshape) {
71 if (can_reshape && _delay_removal) {
72 _delay_removal = false;
73 return this;
74 } else {
75 return NULL;
76 }
77 }
78
79 Node* ProfileBooleanNode::Identity(PhaseGVN* phase) {
80 if (_delay_removal) {
81 return this;
82 } else {
|
43 Node* Opaque1Node::Identity(PhaseGVN* phase) {
44 return phase->C->major_progress() ? this : in(1);
45 }
46
47 //=============================================================================
48 // A node to prevent unwanted optimizations. Allows constant folding. Stops
49 // value-numbering, most Ideal calls or Identity functions. This Node is
50 // specifically designed to prevent the pre-increment value of a loop trip
51 // counter from being live out of the bottom of the loop (hence causing the
52 // pre- and post-increment values both being live and thus requiring an extra
53 // temp register and an extra move). If we "accidentally" optimize through
54 // this kind of a Node, we'll get slightly pessimal, but correct, code. Thus
55 // it's OK to be slightly sloppy on optimizations here.
56
57 // Do not allow value-numbering
58 uint Opaque2Node::hash() const { return NO_HASH; }
59 uint Opaque2Node::cmp( const Node &n ) const {
60 return (&n == this); // Always fail except on self
61 }
62
63 Node* Opaque4Node::Identity(PhaseGVN* phase) {
64 return phase->C->major_progress() ? this : in(2);
65 }
66
67 const Type* Opaque4Node::Value(PhaseGVN* phase) const {
68 return phase->type(in(1));
69 }
70
71 //=============================================================================
72
73 uint ProfileBooleanNode::hash() const { return NO_HASH; }
74 uint ProfileBooleanNode::cmp( const Node &n ) const {
75 return (&n == this);
76 }
77
78 Node *ProfileBooleanNode::Ideal(PhaseGVN *phase, bool can_reshape) {
79 if (can_reshape && _delay_removal) {
80 _delay_removal = false;
81 return this;
82 } else {
83 return NULL;
84 }
85 }
86
87 Node* ProfileBooleanNode::Identity(PhaseGVN* phase) {
88 if (_delay_removal) {
89 return this;
90 } else {
|