src/share/vm/opto/loopTransform.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hotspot Sdiff src/share/vm/opto

src/share/vm/opto/loopTransform.cpp

Print this page
rev 7899 : 8073184: Compile of java.lang.Integer::getChars fails with LoopLimitCheck = false after 8054478
Summary: CastII that guards counted loops confuses range check elimination with LoopLimitCheck off
Reviewed-by:


2015     } // End of is IF
2016 
2017   }
2018 
2019   // Update loop limits
2020   if (conditional_rc) {
2021     pre_limit = (stride_con > 0) ? (Node*)new MinINode(pre_limit, orig_limit)
2022                                  : (Node*)new MaxINode(pre_limit, orig_limit);
2023     register_new_node(pre_limit, pre_ctrl);
2024   }
2025   _igvn.replace_input_of(pre_opaq, 1, pre_limit);
2026 
2027   // Note:: we are making the main loop limit no longer precise;
2028   // need to round up based on stride.
2029   cl->set_nonexact_trip_count();
2030   if (!LoopLimitCheck && stride_con != 1 && stride_con != -1) { // Cutout for common case
2031     // "Standard" round-up logic:  ([main_limit-init+(y-1)]/y)*y+init
2032     // Hopefully, compiler will optimize for powers of 2.
2033     Node *ctrl = get_ctrl(main_limit);
2034     Node *stride = cl->stride();
2035     Node *init = cl->init_trip();
2036     Node *span = new SubINode(main_limit,init);
2037     register_new_node(span,ctrl);
2038     Node *rndup = _igvn.intcon(stride_con + ((stride_con>0)?-1:1));
2039     Node *add = new AddINode(span,rndup);
2040     register_new_node(add,ctrl);
2041     Node *div = new DivINode(0,add,stride);
2042     register_new_node(div,ctrl);
2043     Node *mul = new MulINode(div,stride);
2044     register_new_node(mul,ctrl);
2045     Node *newlim = new AddINode(mul,init);
2046     register_new_node(newlim,ctrl);
2047     main_limit = newlim;
2048   }
2049 
2050   Node *main_cle = cl->loopexit();
2051   Node *main_bol = main_cle->in(1);
2052   // Hacking loop bounds; need private copies of exit test
2053   if( main_bol->outcnt() > 1 ) {// BoolNode shared?
2054     main_bol = main_bol->clone();// Clone a private BoolNode
2055     register_new_node( main_bol, main_cle->in(0) );




2015     } // End of is IF
2016 
2017   }
2018 
2019   // Update loop limits
2020   if (conditional_rc) {
2021     pre_limit = (stride_con > 0) ? (Node*)new MinINode(pre_limit, orig_limit)
2022                                  : (Node*)new MaxINode(pre_limit, orig_limit);
2023     register_new_node(pre_limit, pre_ctrl);
2024   }
2025   _igvn.replace_input_of(pre_opaq, 1, pre_limit);
2026 
2027   // Note:: we are making the main loop limit no longer precise;
2028   // need to round up based on stride.
2029   cl->set_nonexact_trip_count();
2030   if (!LoopLimitCheck && stride_con != 1 && stride_con != -1) { // Cutout for common case
2031     // "Standard" round-up logic:  ([main_limit-init+(y-1)]/y)*y+init
2032     // Hopefully, compiler will optimize for powers of 2.
2033     Node *ctrl = get_ctrl(main_limit);
2034     Node *stride = cl->stride();
2035     Node *init = cl->init_trip()->uncast();
2036     Node *span = new SubINode(main_limit,init);
2037     register_new_node(span,ctrl);
2038     Node *rndup = _igvn.intcon(stride_con + ((stride_con>0)?-1:1));
2039     Node *add = new AddINode(span,rndup);
2040     register_new_node(add,ctrl);
2041     Node *div = new DivINode(0,add,stride);
2042     register_new_node(div,ctrl);
2043     Node *mul = new MulINode(div,stride);
2044     register_new_node(mul,ctrl);
2045     Node *newlim = new AddINode(mul,init);
2046     register_new_node(newlim,ctrl);
2047     main_limit = newlim;
2048   }
2049 
2050   Node *main_cle = cl->loopexit();
2051   Node *main_bol = main_cle->in(1);
2052   // Hacking loop bounds; need private copies of exit test
2053   if( main_bol->outcnt() > 1 ) {// BoolNode shared?
2054     main_bol = main_bol->clone();// Clone a private BoolNode
2055     register_new_node( main_bol, main_cle->in(0) );


src/share/vm/opto/loopTransform.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File