aboutsummaryrefslogtreecommitdiff
path: root/src/share/vm/opto/ifnode.cpp
diff options
context:
space:
mode:
authorkvn <none@none>2011-05-04 13:12:42 -0700
committerkvn <none@none>2011-05-04 13:12:42 -0700
commit8e4328589a700f8cadab8f9b7d73ab75ae54b7f3 (patch)
tree4b85e785d497487fbf8f4bad6403f55b2cd164af /src/share/vm/opto/ifnode.cpp
parent2823a5be160d9d71d9d8672d2eddf04348661112 (diff)
5091921: Sign flip issues in loop optimizer
Summary: Fix integer overflow problem in the code generated by loop optimizer. Reviewed-by: never
Diffstat (limited to 'src/share/vm/opto/ifnode.cpp')
-rw-r--r--src/share/vm/opto/ifnode.cpp9
1 files changed, 5 insertions, 4 deletions
diff --git a/src/share/vm/opto/ifnode.cpp b/src/share/vm/opto/ifnode.cpp
index bcdf5ad64..3a5c3af75 100644
--- a/src/share/vm/opto/ifnode.cpp
+++ b/src/share/vm/opto/ifnode.cpp
@@ -236,6 +236,7 @@ static Node* split_if(IfNode *iff, PhaseIterGVN *igvn) {
}
Node* predicate_c = NULL;
Node* predicate_x = NULL;
+ bool counted_loop = r->is_CountedLoop();
Node *region_c = new (igvn->C, req_c + 1) RegionNode(req_c + 1);
Node *phi_c = con1;
@@ -294,16 +295,16 @@ static Node* split_if(IfNode *iff, PhaseIterGVN *igvn) {
if (predicate_c != NULL) {
assert(predicate_x == NULL, "only one predicate entry expected");
// Clone loop predicates to each path
- iff_c_t = igvn->clone_loop_predicates(predicate_c, iff_c_t);
- iff_c_f = igvn->clone_loop_predicates(predicate_c, iff_c_f);
+ iff_c_t = igvn->clone_loop_predicates(predicate_c, iff_c_t, !counted_loop);
+ iff_c_f = igvn->clone_loop_predicates(predicate_c, iff_c_f, !counted_loop);
}
Node *iff_x_t = phase->transform(new (igvn->C, 1) IfTrueNode (iff_x));
Node *iff_x_f = phase->transform(new (igvn->C, 1) IfFalseNode(iff_x));
if (predicate_x != NULL) {
assert(predicate_c == NULL, "only one predicate entry expected");
// Clone loop predicates to each path
- iff_x_t = igvn->clone_loop_predicates(predicate_x, iff_x_t);
- iff_x_f = igvn->clone_loop_predicates(predicate_x, iff_x_f);
+ iff_x_t = igvn->clone_loop_predicates(predicate_x, iff_x_t, !counted_loop);
+ iff_x_f = igvn->clone_loop_predicates(predicate_x, iff_x_f, !counted_loop);
}
// Merge the TRUE paths