Mercurial > hg > truffle
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); |