Mercurial > hg > graal-jvmci-8
diff src/share/vm/opto/loopopts.cpp @ 3840:4e761e7e6e12
7070134: Hotspot crashes with sigsegv from PorterStemmer
Summary: Do not move data nodes which are attached to a predicate test to a dominating test.
Reviewed-by: never
author | kvn |
---|---|
date | Tue, 26 Jul 2011 19:35:23 -0700 |
parents | 273b56978029 |
children | d8cb48376797 |
line wrap: on
line diff
--- a/src/share/vm/opto/loopopts.cpp Thu Jul 21 11:25:07 2011 -0700 +++ b/src/share/vm/opto/loopopts.cpp Tue Jul 26 19:35:23 2011 -0700 @@ -194,7 +194,7 @@ // Replace the dominated test with an obvious true or false. Place it on the // IGVN worklist for later cleanup. Move control-dependent data Nodes on the // live path up to the dominating control. -void PhaseIdealLoop::dominated_by( Node *prevdom, Node *iff, bool flip ) { +void PhaseIdealLoop::dominated_by( Node *prevdom, Node *iff, bool flip, bool exclude_loop_predicate ) { #ifndef PRODUCT if (VerifyLoopOptimizations && PrintOpto) tty->print_cr("dominating test"); #endif @@ -228,7 +228,16 @@ // Make control-dependent data Nodes on the live path (path that will remain // once the dominated IF is removed) become control-dependent on the // dominating projection. - Node* dp = ((IfNode*)iff)->proj_out(pop == Op_IfTrue); + Node* dp = iff->as_If()->proj_out(pop == Op_IfTrue); + + // Loop predicates may have depending checks which should not + // be skipped. For example, range check predicate has two checks + // for lower and upper bounds. + ProjNode* unc_proj = iff->as_If()->proj_out(1 - dp->as_Proj()->_con)->as_Proj(); + if (exclude_loop_predicate && + is_uncommon_trap_proj(unc_proj, Deoptimization::Reason_predicate)) + return; // Let IGVN transformation change control dependence. + IdealLoopTree *old_loop = get_loop(dp); for (DUIterator_Fast imax, i = dp->fast_outs(imax); i < imax; i++) { @@ -859,7 +868,7 @@ // Replace the dominated test with an obvious true or false. // Place it on the IGVN worklist for later cleanup. C->set_major_progress(); - dominated_by( prevdom, n ); + dominated_by( prevdom, n, false, true ); #ifndef PRODUCT if( VerifyLoopOptimizations ) verify(); #endif