@@ -698,7 +698,7 @@ bool IdealLoopTree::is_range_check_if(IfNode *iff, PhaseIdealLoop *phase, Invari
698
698
BoolNode* PhaseIdealLoop::rc_predicate (IdealLoopTree *loop, Node* ctrl,
699
699
int scale, Node* offset,
700
700
Node* init, Node* limit, jint stride,
701
- Node* range, bool upper, bool &overflow) {
701
+ Node* range, bool upper, bool &overflow, bool negate ) {
702
702
jint con_limit = (limit != NULL && limit->is_Con ()) ? limit->get_int () : 0 ;
703
703
jint con_init = init->is_Con () ? init->get_int () : 0 ;
704
704
jint con_offset = offset->is_Con () ? offset->get_int () : 0 ;
@@ -824,7 +824,7 @@ BoolNode* PhaseIdealLoop::rc_predicate(IdealLoopTree *loop, Node* ctrl,
824
824
cmp = new CmpUNode (max_idx_expr, range);
825
825
}
826
826
register_new_node (cmp, ctrl);
827
- BoolNode* bol = new BoolNode (cmp, BoolTest::lt);
827
+ BoolNode* bol = new BoolNode (cmp, negate ? BoolTest::ge : BoolTest::lt);
828
828
register_new_node (bol, ctrl);
829
829
830
830
if (TraceLoopPredicate) {
@@ -1191,36 +1191,26 @@ bool PhaseIdealLoop::loop_predication_impl_helper(IdealLoopTree *loop, ProjNode*
1191
1191
}
1192
1192
// If predicate expressions may overflow in the integer range, longs are used.
1193
1193
bool overflow = false ;
1194
+ bool negate = (proj->_con != predicate_proj->_con );
1194
1195
1195
1196
// Test the lower bound
1196
- BoolNode* lower_bound_bol = rc_predicate (loop, ctrl, scale, offset, init, limit, stride, rng, false , overflow);
1197
- // Negate test if necessary
1198
- bool negated = false ;
1199
- if (proj->_con != predicate_proj->_con ) {
1200
- lower_bound_bol = new BoolNode (lower_bound_bol->in (1 ), lower_bound_bol->_test .negate ());
1201
- register_new_node (lower_bound_bol, ctrl);
1202
- negated = true ;
1203
- }
1197
+ BoolNode* lower_bound_bol = rc_predicate (loop, ctrl, scale, offset, init, limit, stride, rng, false , overflow, negate);
1198
+
1204
1199
ProjNode* lower_bound_proj = create_new_if_for_predicate (predicate_proj, NULL , reason, overflow ? Op_If : iff->Opcode ());
1205
1200
IfNode* lower_bound_iff = lower_bound_proj->in (0 )->as_If ();
1206
1201
_igvn.hash_delete (lower_bound_iff);
1207
1202
lower_bound_iff->set_req (1 , lower_bound_bol);
1208
- if (TraceLoopPredicate) tty->print_cr (" lower bound check if: %s %d " , negated ? " negated" : " " , lower_bound_iff->_idx );
1203
+ if (TraceLoopPredicate) tty->print_cr (" lower bound check if: %s %d " , negate ? " negated" : " " , lower_bound_iff->_idx );
1209
1204
1210
1205
// Test the upper bound
1211
- BoolNode* upper_bound_bol = rc_predicate (loop, lower_bound_proj, scale, offset, init, limit, stride, rng, true , overflow);
1212
- negated = false ;
1213
- if (proj->_con != predicate_proj->_con ) {
1214
- upper_bound_bol = new BoolNode (upper_bound_bol->in (1 ), upper_bound_bol->_test .negate ());
1215
- register_new_node (upper_bound_bol, ctrl);
1216
- negated = true ;
1217
- }
1206
+ BoolNode* upper_bound_bol = rc_predicate (loop, lower_bound_proj, scale, offset, init, limit, stride, rng, true , overflow, negate);
1207
+
1218
1208
ProjNode* upper_bound_proj = create_new_if_for_predicate (predicate_proj, NULL , reason, overflow ? Op_If : iff->Opcode ());
1219
1209
assert (upper_bound_proj->in (0 )->as_If ()->in (0 ) == lower_bound_proj, " should dominate" );
1220
1210
IfNode* upper_bound_iff = upper_bound_proj->in (0 )->as_If ();
1221
1211
_igvn.hash_delete (upper_bound_iff);
1222
1212
upper_bound_iff->set_req (1 , upper_bound_bol);
1223
- if (TraceLoopPredicate) tty->print_cr (" upper bound check if: %s %d " , negated ? " negated" : " " , lower_bound_iff->_idx );
1213
+ if (TraceLoopPredicate) tty->print_cr (" upper bound check if: %s %d " , negate ? " negated" : " " , lower_bound_iff->_idx );
1224
1214
1225
1215
// Fall through into rest of the clean up code which will move
1226
1216
// any dependent nodes onto the upper bound test.
@@ -1266,10 +1256,10 @@ ProjNode* PhaseIdealLoop::insert_initial_skeleton_predicate(IfNode* iff, IdealLo
1266
1256
Node* rng, bool &overflow,
1267
1257
Deoptimization::DeoptReason reason) {
1268
1258
// First predicate for the initial value on first loop iteration
1269
- assert (proj->_con && predicate_proj->_con , " not a range check?" );
1270
1259
Node* opaque_init = new OpaqueLoopInitNode (C, init);
1271
1260
register_new_node (opaque_init, upper_bound_proj);
1272
- BoolNode* bol = rc_predicate (loop, upper_bound_proj, scale, offset, opaque_init, limit, stride, rng, (stride > 0 ) != (scale > 0 ), overflow);
1261
+ bool negate = (proj->_con != predicate_proj->_con );
1262
+ BoolNode* bol = rc_predicate (loop, upper_bound_proj, scale, offset, opaque_init, limit, stride, rng, (stride > 0 ) != (scale > 0 ), overflow, negate);
1273
1263
Node* opaque_bol = new Opaque4Node (C, bol, _igvn.intcon (1 )); // This will go away once loop opts are over
1274
1264
register_new_node (opaque_bol, upper_bound_proj);
1275
1265
ProjNode* new_proj = create_new_if_for_predicate (predicate_proj, NULL , reason, overflow ? Op_If : iff->Opcode ());
@@ -1286,7 +1276,7 @@ ProjNode* PhaseIdealLoop::insert_initial_skeleton_predicate(IfNode* iff, IdealLo
1286
1276
register_new_node (max_value, new_proj);
1287
1277
max_value = new AddINode (opaque_init, max_value);
1288
1278
register_new_node (max_value, new_proj);
1289
- bol = rc_predicate (loop, new_proj, scale, offset, max_value, limit, stride, rng, (stride > 0 ) != (scale > 0 ), overflow);
1279
+ bol = rc_predicate (loop, new_proj, scale, offset, max_value, limit, stride, rng, (stride > 0 ) != (scale > 0 ), overflow, negate );
1290
1280
opaque_bol = new Opaque4Node (C, bol, _igvn.intcon (1 ));
1291
1281
register_new_node (opaque_bol, new_proj);
1292
1282
new_proj = create_new_if_for_predicate (predicate_proj, NULL , reason, overflow ? Op_If : iff->Opcode ());
0 commit comments