comparison src/share/vm/opto/ifnode.cpp @ 3345:bad7ecd0b6ed

5091921: Sign flip issues in loop optimizer Summary: Fix integer overflow problem in the code generated by loop optimizer. Reviewed-by: never
author kvn
date Wed, 04 May 2011 13:12:42 -0700
parents 08eb13460b3a
children f879eafd5835
comparison
equal deleted inserted replaced
3344:0139aac70fb5 3345:bad7ecd0b6ed
234 predicate_proj = proj; 234 predicate_proj = proj;
235 } 235 }
236 } 236 }
237 Node* predicate_c = NULL; 237 Node* predicate_c = NULL;
238 Node* predicate_x = NULL; 238 Node* predicate_x = NULL;
239 bool counted_loop = r->is_CountedLoop();
239 240
240 Node *region_c = new (igvn->C, req_c + 1) RegionNode(req_c + 1); 241 Node *region_c = new (igvn->C, req_c + 1) RegionNode(req_c + 1);
241 Node *phi_c = con1; 242 Node *phi_c = con1;
242 uint len = r->req(); 243 uint len = r->req();
243 Node *region_x = new (igvn->C, len - req_c) RegionNode(len - req_c); 244 Node *region_x = new (igvn->C, len - req_c) RegionNode(len - req_c);
292 Node *iff_c_t = phase->transform(new (igvn->C, 1) IfTrueNode (iff_c)); 293 Node *iff_c_t = phase->transform(new (igvn->C, 1) IfTrueNode (iff_c));
293 Node *iff_c_f = phase->transform(new (igvn->C, 1) IfFalseNode(iff_c)); 294 Node *iff_c_f = phase->transform(new (igvn->C, 1) IfFalseNode(iff_c));
294 if (predicate_c != NULL) { 295 if (predicate_c != NULL) {
295 assert(predicate_x == NULL, "only one predicate entry expected"); 296 assert(predicate_x == NULL, "only one predicate entry expected");
296 // Clone loop predicates to each path 297 // Clone loop predicates to each path
297 iff_c_t = igvn->clone_loop_predicates(predicate_c, iff_c_t); 298 iff_c_t = igvn->clone_loop_predicates(predicate_c, iff_c_t, !counted_loop);
298 iff_c_f = igvn->clone_loop_predicates(predicate_c, iff_c_f); 299 iff_c_f = igvn->clone_loop_predicates(predicate_c, iff_c_f, !counted_loop);
299 } 300 }
300 Node *iff_x_t = phase->transform(new (igvn->C, 1) IfTrueNode (iff_x)); 301 Node *iff_x_t = phase->transform(new (igvn->C, 1) IfTrueNode (iff_x));
301 Node *iff_x_f = phase->transform(new (igvn->C, 1) IfFalseNode(iff_x)); 302 Node *iff_x_f = phase->transform(new (igvn->C, 1) IfFalseNode(iff_x));
302 if (predicate_x != NULL) { 303 if (predicate_x != NULL) {
303 assert(predicate_c == NULL, "only one predicate entry expected"); 304 assert(predicate_c == NULL, "only one predicate entry expected");
304 // Clone loop predicates to each path 305 // Clone loop predicates to each path
305 iff_x_t = igvn->clone_loop_predicates(predicate_x, iff_x_t); 306 iff_x_t = igvn->clone_loop_predicates(predicate_x, iff_x_t, !counted_loop);
306 iff_x_f = igvn->clone_loop_predicates(predicate_x, iff_x_f); 307 iff_x_f = igvn->clone_loop_predicates(predicate_x, iff_x_f, !counted_loop);
307 } 308 }
308 309
309 // Merge the TRUE paths 310 // Merge the TRUE paths
310 Node *region_s = new (igvn->C, 3) RegionNode(3); 311 Node *region_s = new (igvn->C, 3) RegionNode(3);
311 igvn->_worklist.push(region_s); 312 igvn->_worklist.push(region_s);