src/share/vm/opto/loopTransform.cpp

changeset 4157
377508648226
parent 4115
e626685e9f6c
child 4159
8e47bac5643a
equal deleted inserted replaced
4156:9024b6b53ec2 4157:377508648226
90 Node* limit_n = cl->limit(); 90 Node* limit_n = cl->limit();
91 if (init_n != NULL && init_n->is_Con() && 91 if (init_n != NULL && init_n->is_Con() &&
92 limit_n != NULL && limit_n->is_Con()) { 92 limit_n != NULL && limit_n->is_Con()) {
93 // Use longs to avoid integer overflow. 93 // Use longs to avoid integer overflow.
94 int stride_con = cl->stride_con(); 94 int stride_con = cl->stride_con();
95 long init_con = cl->init_trip()->get_int(); 95 jlong init_con = cl->init_trip()->get_int();
96 long limit_con = cl->limit()->get_int(); 96 jlong limit_con = cl->limit()->get_int();
97 int stride_m = stride_con - (stride_con > 0 ? 1 : -1); 97 int stride_m = stride_con - (stride_con > 0 ? 1 : -1);
98 long trip_count = (limit_con - init_con + stride_m)/stride_con; 98 jlong trip_count = (limit_con - init_con + stride_m)/stride_con;
99 if (trip_count > 0 && (julong)trip_count < (julong)max_juint) { 99 if (trip_count > 0 && (julong)trip_count < (julong)max_juint) {
100 // Set exact trip count. 100 // Set exact trip count.
101 cl->set_exact_trip_count((uint)trip_count); 101 cl->set_exact_trip_count((uint)trip_count);
102 } 102 }
103 } 103 }
1210 "odd trip count for maximally unroll"); 1210 "odd trip count for maximally unroll");
1211 // Don't need to adjust limit for maximally unroll since trip count is even. 1211 // Don't need to adjust limit for maximally unroll since trip count is even.
1212 } else if (loop_head->has_exact_trip_count() && init->is_Con()) { 1212 } else if (loop_head->has_exact_trip_count() && init->is_Con()) {
1213 // Loop's limit is constant. Loop's init could be constant when pre-loop 1213 // Loop's limit is constant. Loop's init could be constant when pre-loop
1214 // become peeled iteration. 1214 // become peeled iteration.
1215 long init_con = init->get_int(); 1215 jlong init_con = init->get_int();
1216 // We can keep old loop limit if iterations count stays the same: 1216 // We can keep old loop limit if iterations count stays the same:
1217 // old_trip_count == new_trip_count * 2 1217 // old_trip_count == new_trip_count * 2
1218 // Note: since old_trip_count >= 2 then new_trip_count >= 1 1218 // Note: since old_trip_count >= 2 then new_trip_count >= 1
1219 // so we also don't need to adjust zero trip test. 1219 // so we also don't need to adjust zero trip test.
1220 long limit_con = limit->get_int(); 1220 jlong limit_con = limit->get_int();
1221 // (stride_con*2) not overflow since stride_con <= 8. 1221 // (stride_con*2) not overflow since stride_con <= 8.
1222 int new_stride_con = stride_con * 2; 1222 int new_stride_con = stride_con * 2;
1223 int stride_m = new_stride_con - (stride_con > 0 ? 1 : -1); 1223 int stride_m = new_stride_con - (stride_con > 0 ? 1 : -1);
1224 long trip_count = (limit_con - init_con + stride_m)/new_stride_con; 1224 jlong trip_count = (limit_con - init_con + stride_m)/new_stride_con;
1225 // New trip count should satisfy next conditions. 1225 // New trip count should satisfy next conditions.
1226 assert(trip_count > 0 && (julong)trip_count < (julong)max_juint/2, "sanity"); 1226 assert(trip_count > 0 && (julong)trip_count < (julong)max_juint/2, "sanity");
1227 uint new_trip_count = (uint)trip_count; 1227 uint new_trip_count = (uint)trip_count;
1228 adjust_min_trip = (old_trip_count != new_trip_count*2); 1228 adjust_min_trip = (old_trip_count != new_trip_count*2);
1229 } 1229 }

mercurial