118 }
119
120 IfNode* iff = new IfNode(*ctrl, test, true_prob, COUNT_UNKNOWN);
121 transform_later(iff);
122
123 Node* if_slow = new IfTrueNode(iff);
124 transform_later(if_slow);
125
126 if (region != NULL) {
127 region->add_req(if_slow);
128 }
129
130 Node* if_fast = new IfFalseNode(iff);
131 transform_later(if_fast);
132
133 *ctrl = if_fast;
134
135 return if_slow;
136 }
137
138 inline Node* PhaseMacroExpand::generate_slow_guard(Node** ctrl, Node* test, RegionNode* region) {
139 return generate_guard(ctrl, test, region, PROB_UNLIKELY_MAG(3));
140 }
141
142 inline Node* PhaseMacroExpand::generate_fair_guard(Node** ctrl, Node* test, RegionNode* region) {
143 return generate_guard(ctrl, test, region, PROB_FAIR);
144 }
145
146 void PhaseMacroExpand::generate_negative_guard(Node** ctrl, Node* index, RegionNode* region) {
147 if ((*ctrl)->is_top())
148 return; // already stopped
149 if (_igvn.type(index)->higher_equal(TypeInt::POS)) // [0,maxint]
150 return; // index is already adequately typed
151 Node* cmp_lt = new CmpINode(index, intcon(0));
152 transform_later(cmp_lt);
153 Node* bol_lt = new BoolNode(cmp_lt, BoolTest::lt);
154 transform_later(bol_lt);
155 generate_guard(ctrl, bol_lt, region, PROB_MIN);
156 }
157
158 void PhaseMacroExpand::generate_limit_guard(Node** ctrl, Node* offset, Node* subseq_length, Node* array_length, RegionNode* region) {
|
118 }
119
120 IfNode* iff = new IfNode(*ctrl, test, true_prob, COUNT_UNKNOWN);
121 transform_later(iff);
122
123 Node* if_slow = new IfTrueNode(iff);
124 transform_later(if_slow);
125
126 if (region != NULL) {
127 region->add_req(if_slow);
128 }
129
130 Node* if_fast = new IfFalseNode(iff);
131 transform_later(if_fast);
132
133 *ctrl = if_fast;
134
135 return if_slow;
136 }
137
138 Node* PhaseMacroExpand::generate_slow_guard(Node** ctrl, Node* test, RegionNode* region) {
139 return generate_guard(ctrl, test, region, PROB_UNLIKELY_MAG(3));
140 }
141
142 inline Node* PhaseMacroExpand::generate_fair_guard(Node** ctrl, Node* test, RegionNode* region) {
143 return generate_guard(ctrl, test, region, PROB_FAIR);
144 }
145
146 void PhaseMacroExpand::generate_negative_guard(Node** ctrl, Node* index, RegionNode* region) {
147 if ((*ctrl)->is_top())
148 return; // already stopped
149 if (_igvn.type(index)->higher_equal(TypeInt::POS)) // [0,maxint]
150 return; // index is already adequately typed
151 Node* cmp_lt = new CmpINode(index, intcon(0));
152 transform_later(cmp_lt);
153 Node* bol_lt = new BoolNode(cmp_lt, BoolTest::lt);
154 transform_later(bol_lt);
155 generate_guard(ctrl, bol_lt, region, PROB_MIN);
156 }
157
158 void PhaseMacroExpand::generate_limit_guard(Node** ctrl, Node* offset, Node* subseq_length, Node* array_length, RegionNode* region) {
|