@@ -816,7 +816,7 @@ bool IdealLoopTree::is_range_check_if(IfNode *iff, PhaseIdealLoop *phase, Invari
816
816
BoolNode* PhaseIdealLoop::rc_predicate (IdealLoopTree *loop, Node* ctrl,
817
817
int scale, Node* offset,
818
818
Node* init, Node* limit, jint stride,
819
- Node* range, bool upper, bool &overflow) {
819
+ Node* range, bool upper, bool &overflow, bool negate ) {
820
820
jint con_limit = (limit != NULL && limit->is_Con ()) ? limit->get_int () : 0 ;
821
821
jint con_init = init->is_Con () ? init->get_int () : 0 ;
822
822
jint con_offset = offset->is_Con () ? offset->get_int () : 0 ;
@@ -942,7 +942,7 @@ BoolNode* PhaseIdealLoop::rc_predicate(IdealLoopTree *loop, Node* ctrl,
942
942
cmp = new CmpUNode (max_idx_expr, range);
943
943
}
944
944
register_new_node (cmp, ctrl);
945
- BoolNode* bol = new BoolNode (cmp, BoolTest::lt);
945
+ BoolNode* bol = new BoolNode (cmp, negate ? BoolTest::ge : BoolTest::lt);
946
946
register_new_node (bol, ctrl);
947
947
948
948
if (TraceLoopPredicate) {
@@ -1309,36 +1309,26 @@ bool PhaseIdealLoop::loop_predication_impl_helper(IdealLoopTree *loop, ProjNode*
1309
1309
}
1310
1310
// If predicate expressions may overflow in the integer range, longs are used.
1311
1311
bool overflow = false ;
1312
+ bool negate = (proj->_con != predicate_proj->_con );
1312
1313
1313
1314
// Test the lower bound
1314
- BoolNode* lower_bound_bol = rc_predicate (loop, ctrl, scale, offset, init, limit, stride, rng, false , overflow);
1315
- // Negate test if necessary
1316
- bool negated = false ;
1317
- if (proj->_con != predicate_proj->_con ) {
1318
- lower_bound_bol = new BoolNode (lower_bound_bol->in (1 ), lower_bound_bol->_test .negate ());
1319
- register_new_node (lower_bound_bol, ctrl);
1320
- negated = true ;
1321
- }
1315
+ BoolNode* lower_bound_bol = rc_predicate (loop, ctrl, scale, offset, init, limit, stride, rng, false , overflow, negate);
1316
+
1322
1317
ProjNode* lower_bound_proj = create_new_if_for_predicate (predicate_proj, NULL , reason, overflow ? Op_If : iff->Opcode ());
1323
1318
IfNode* lower_bound_iff = lower_bound_proj->in (0 )->as_If ();
1324
1319
_igvn.hash_delete (lower_bound_iff);
1325
1320
lower_bound_iff->set_req (1 , lower_bound_bol);
1326
- if (TraceLoopPredicate) tty->print_cr (" lower bound check if: %s %d " , negated ? " negated" : " " , lower_bound_iff->_idx );
1321
+ if (TraceLoopPredicate) tty->print_cr (" lower bound check if: %s %d " , negate ? " negated" : " " , lower_bound_iff->_idx );
1327
1322
1328
1323
// Test the upper bound
1329
- BoolNode* upper_bound_bol = rc_predicate (loop, lower_bound_proj, scale, offset, init, limit, stride, rng, true , overflow);
1330
- negated = false ;
1331
- if (proj->_con != predicate_proj->_con ) {
1332
- upper_bound_bol = new BoolNode (upper_bound_bol->in (1 ), upper_bound_bol->_test .negate ());
1333
- register_new_node (upper_bound_bol, ctrl);
1334
- negated = true ;
1335
- }
1324
+ BoolNode* upper_bound_bol = rc_predicate (loop, lower_bound_proj, scale, offset, init, limit, stride, rng, true , overflow, negate);
1325
+
1336
1326
ProjNode* upper_bound_proj = create_new_if_for_predicate (predicate_proj, NULL , reason, overflow ? Op_If : iff->Opcode ());
1337
1327
assert (upper_bound_proj->in (0 )->as_If ()->in (0 ) == lower_bound_proj, " should dominate" );
1338
1328
IfNode* upper_bound_iff = upper_bound_proj->in (0 )->as_If ();
1339
1329
_igvn.hash_delete (upper_bound_iff);
1340
1330
upper_bound_iff->set_req (1 , upper_bound_bol);
1341
- if (TraceLoopPredicate) tty->print_cr (" upper bound check if: %s %d " , negated ? " negated" : " " , lower_bound_iff->_idx );
1331
+ if (TraceLoopPredicate) tty->print_cr (" upper bound check if: %s %d " , negate ? " negated" : " " , lower_bound_iff->_idx );
1342
1332
1343
1333
// Fall through into rest of the clean up code which will move
1344
1334
// any dependent nodes onto the upper bound test.
@@ -1384,10 +1374,10 @@ ProjNode* PhaseIdealLoop::insert_initial_skeleton_predicate(IfNode* iff, IdealLo
1384
1374
Node* rng, bool &overflow,
1385
1375
Deoptimization::DeoptReason reason) {
1386
1376
// First predicate for the initial value on first loop iteration
1387
- assert (proj->_con && predicate_proj->_con , " not a range check?" );
1388
1377
Node* opaque_init = new OpaqueLoopInitNode (C, init);
1389
1378
register_new_node (opaque_init, upper_bound_proj);
1390
- BoolNode* bol = rc_predicate (loop, upper_bound_proj, scale, offset, opaque_init, limit, stride, rng, (stride > 0 ) != (scale > 0 ), overflow);
1379
+ bool negate = (proj->_con != predicate_proj->_con );
1380
+ BoolNode* bol = rc_predicate (loop, upper_bound_proj, scale, offset, opaque_init, limit, stride, rng, (stride > 0 ) != (scale > 0 ), overflow, negate);
1391
1381
Node* opaque_bol = new Opaque4Node (C, bol, _igvn.intcon (1 )); // This will go away once loop opts are over
1392
1382
C->add_skeleton_predicate_opaq (opaque_bol);
1393
1383
register_new_node (opaque_bol, upper_bound_proj);
@@ -1405,7 +1395,7 @@ ProjNode* PhaseIdealLoop::insert_initial_skeleton_predicate(IfNode* iff, IdealLo
1405
1395
register_new_node (max_value, new_proj);
1406
1396
max_value = new AddINode (opaque_init, max_value);
1407
1397
register_new_node (max_value, new_proj);
1408
- bol = rc_predicate (loop, new_proj, scale, offset, max_value, limit, stride, rng, (stride > 0 ) != (scale > 0 ), overflow);
1398
+ bol = rc_predicate (loop, new_proj, scale, offset, max_value, limit, stride, rng, (stride > 0 ) != (scale > 0 ), overflow, negate );
1409
1399
opaque_bol = new Opaque4Node (C, bol, _igvn.intcon (1 ));
1410
1400
C->add_skeleton_predicate_opaq (opaque_bol);
1411
1401
register_new_node (opaque_bol, new_proj);
0 commit comments