@@ -802,7 +802,7 @@ bool IdealLoopTree::is_range_check_if(IfNode *iff, PhaseIdealLoop *phase, Invari
802
802
BoolNode* PhaseIdealLoop::rc_predicate (IdealLoopTree *loop, Node* ctrl,
803
803
int scale, Node* offset,
804
804
Node* init, Node* limit, jint stride,
805
- Node* range, bool upper, bool &overflow) {
805
+ Node* range, bool upper, bool &overflow, bool negate ) {
806
806
jint con_limit = (limit != NULL && limit->is_Con ()) ? limit->get_int () : 0 ;
807
807
jint con_init = init->is_Con () ? init->get_int () : 0 ;
808
808
jint con_offset = offset->is_Con () ? offset->get_int () : 0 ;
@@ -928,7 +928,7 @@ BoolNode* PhaseIdealLoop::rc_predicate(IdealLoopTree *loop, Node* ctrl,
928
928
cmp = new CmpUNode (max_idx_expr, range);
929
929
}
930
930
register_new_node (cmp, ctrl);
931
- BoolNode* bol = new BoolNode (cmp, BoolTest::lt);
931
+ BoolNode* bol = new BoolNode (cmp, negate ? BoolTest::ge : BoolTest::lt);
932
932
register_new_node (bol, ctrl);
933
933
934
934
if (TraceLoopPredicate) {
@@ -1295,36 +1295,26 @@ bool PhaseIdealLoop::loop_predication_impl_helper(IdealLoopTree *loop, ProjNode*
1295
1295
}
1296
1296
// If predicate expressions may overflow in the integer range, longs are used.
1297
1297
bool overflow = false ;
1298
+ bool negate = (proj->_con != predicate_proj->_con );
1298
1299
1299
1300
// Test the lower bound
1300
- BoolNode* lower_bound_bol = rc_predicate (loop, ctrl, scale, offset, init, limit, stride, rng, false , overflow);
1301
- // Negate test if necessary
1302
- bool negated = false ;
1303
- if (proj->_con != predicate_proj->_con ) {
1304
- lower_bound_bol = new BoolNode (lower_bound_bol->in (1 ), lower_bound_bol->_test .negate ());
1305
- register_new_node (lower_bound_bol, ctrl);
1306
- negated = true ;
1307
- }
1301
+ BoolNode* lower_bound_bol = rc_predicate (loop, ctrl, scale, offset, init, limit, stride, rng, false , overflow, negate);
1302
+
1308
1303
ProjNode* lower_bound_proj = create_new_if_for_predicate (predicate_proj, NULL , reason, overflow ? Op_If : iff->Opcode ());
1309
1304
IfNode* lower_bound_iff = lower_bound_proj->in (0 )->as_If ();
1310
1305
_igvn.hash_delete (lower_bound_iff);
1311
1306
lower_bound_iff->set_req (1 , lower_bound_bol);
1312
- if (TraceLoopPredicate) tty->print_cr (" lower bound check if: %s %d " , negated ? " negated" : " " , lower_bound_iff->_idx );
1307
+ if (TraceLoopPredicate) tty->print_cr (" lower bound check if: %s %d " , negate ? " negated" : " " , lower_bound_iff->_idx );
1313
1308
1314
1309
// Test the upper bound
1315
- BoolNode* upper_bound_bol = rc_predicate (loop, lower_bound_proj, scale, offset, init, limit, stride, rng, true , overflow);
1316
- negated = false ;
1317
- if (proj->_con != predicate_proj->_con ) {
1318
- upper_bound_bol = new BoolNode (upper_bound_bol->in (1 ), upper_bound_bol->_test .negate ());
1319
- register_new_node (upper_bound_bol, ctrl);
1320
- negated = true ;
1321
- }
1310
+ BoolNode* upper_bound_bol = rc_predicate (loop, lower_bound_proj, scale, offset, init, limit, stride, rng, true , overflow, negate);
1311
+
1322
1312
ProjNode* upper_bound_proj = create_new_if_for_predicate (predicate_proj, NULL , reason, overflow ? Op_If : iff->Opcode ());
1323
1313
assert (upper_bound_proj->in (0 )->as_If ()->in (0 ) == lower_bound_proj, " should dominate" );
1324
1314
IfNode* upper_bound_iff = upper_bound_proj->in (0 )->as_If ();
1325
1315
_igvn.hash_delete (upper_bound_iff);
1326
1316
upper_bound_iff->set_req (1 , upper_bound_bol);
1327
- if (TraceLoopPredicate) tty->print_cr (" upper bound check if: %s %d " , negated ? " negated" : " " , lower_bound_iff->_idx );
1317
+ if (TraceLoopPredicate) tty->print_cr (" upper bound check if: %s %d " , negate ? " negated" : " " , lower_bound_iff->_idx );
1328
1318
1329
1319
// Fall through into rest of the clean up code which will move
1330
1320
// any dependent nodes onto the upper bound test.
@@ -1370,10 +1360,10 @@ ProjNode* PhaseIdealLoop::insert_initial_skeleton_predicate(IfNode* iff, IdealLo
1370
1360
Node* rng, bool &overflow,
1371
1361
Deoptimization::DeoptReason reason) {
1372
1362
// First predicate for the initial value on first loop iteration
1373
- assert (proj->_con && predicate_proj->_con , " not a range check?" );
1374
1363
Node* opaque_init = new OpaqueLoopInitNode (C, init);
1375
1364
register_new_node (opaque_init, upper_bound_proj);
1376
- BoolNode* bol = rc_predicate (loop, upper_bound_proj, scale, offset, opaque_init, limit, stride, rng, (stride > 0 ) != (scale > 0 ), overflow);
1365
+ bool negate = (proj->_con != predicate_proj->_con );
1366
+ BoolNode* bol = rc_predicate (loop, upper_bound_proj, scale, offset, opaque_init, limit, stride, rng, (stride > 0 ) != (scale > 0 ), overflow, negate);
1377
1367
Node* opaque_bol = new Opaque4Node (C, bol, _igvn.intcon (1 )); // This will go away once loop opts are over
1378
1368
C->add_skeleton_predicate_opaq (opaque_bol);
1379
1369
register_new_node (opaque_bol, upper_bound_proj);
@@ -1391,7 +1381,7 @@ ProjNode* PhaseIdealLoop::insert_initial_skeleton_predicate(IfNode* iff, IdealLo
1391
1381
register_new_node (max_value, new_proj);
1392
1382
max_value = new AddINode (opaque_init, max_value);
1393
1383
register_new_node (max_value, new_proj);
1394
- bol = rc_predicate (loop, new_proj, scale, offset, max_value, limit, stride, rng, (stride > 0 ) != (scale > 0 ), overflow);
1384
+ bol = rc_predicate (loop, new_proj, scale, offset, max_value, limit, stride, rng, (stride > 0 ) != (scale > 0 ), overflow, negate );
1395
1385
opaque_bol = new Opaque4Node (C, bol, _igvn.intcon (1 ));
1396
1386
C->add_skeleton_predicate_opaq (opaque_bol);
1397
1387
register_new_node (opaque_bol, new_proj);
0 commit comments