@@ -940,12 +940,20 @@ bool PhaseIdealLoop::create_loop_nest(IdealLoopTree* loop, Node_List &old_new) {
940
940
// inner_iters_max may not fit in a signed integer (iterating from
941
941
// Long.MIN_VALUE to Long.MAX_VALUE for instance). Use an unsigned
942
942
// min.
943
- Node* inner_iters_actual = MaxNode::unsigned_min (inner_iters_max, inner_iters_limit, TypeInteger::make (0 , iters_limit, Type::WidenMin, bt), _igvn);
943
+ const TypeInteger* inner_iters_actual_range = TypeInteger::make (0 , iters_limit, Type::WidenMin, bt);
944
+ Node* inner_iters_actual = MaxNode::unsigned_min (inner_iters_max, inner_iters_limit, inner_iters_actual_range, _igvn);
944
945
945
946
Node* inner_iters_actual_int;
946
947
if (bt == T_LONG) {
947
948
inner_iters_actual_int = new ConvL2INode (inner_iters_actual);
948
949
_igvn.register_new_node_with_optimizer (inner_iters_actual_int);
950
+ // When the inner loop is transformed to a counted loop, a loop limit check is not expected to be needed because
951
+ // the loop limit is less or equal to max_jint - stride - 1 (if stride is positive but a similar argument exists for
952
+ // a negative stride). We add a CastII here to guarantee that, when the counted loop is created in a subsequent loop
953
+ // opts pass, an accurate range of values for the limits is found.
954
+ const TypeInt* inner_iters_actual_int_range = TypeInt::make (0 , iters_limit, Type::WidenMin);
955
+ inner_iters_actual_int = new CastIINode (outer_head, inner_iters_actual_int, inner_iters_actual_int_range, ConstraintCastNode::UnconditionalDependency);
956
+ _igvn.register_new_node_with_optimizer (inner_iters_actual_int);
949
957
} else {
950
958
inner_iters_actual_int = inner_iters_actual;
951
959
}
0 commit comments