Request for reviews (L): 7008866: Missing loop predicate for loop with multiple entries
Tom Rodriguez
tom.rodriguez at oracle.com
Fri Mar 18 16:19:46 PDT 2011
is_canonical_counted reads weird. Maybe is_valid_counted_loop?
Do the intrinsics really benefit from having predicates? Most those assume that Strings are well formed and don't have range checks.
If you have the urge, a lot of the code that simply moved could have its "if( " whitespace corrected.
loopnode.cpp:
Is this no longer needed or did it more somewhere?
_igvn.hash_delete(phi);
phi->set_req_X( LoopNode::LoopBackControl, incr, &_igvn );
// If phi type is more restrictive than Int, raise to
// Int to prevent (almost) infinite recursion in igvn
// which can only handle integer types for constants or minint..maxint.
if (!TypeInt::INT->higher_equal(phi->bottom_type())) {
Node* nphi = PhiNode::make(phi->in(0), phi->in(LoopNode::EntryControl), TypeInt::INT);
nphi->set_req(LoopNode::LoopBackControl, phi->in(LoopNode::LoopBackControl));
nphi = _igvn.register_new_node_with_optimizer(nphi);
set_ctrl(nphi, get_ctrl(phi));
+ nphi->set_req(LoopNode::LoopBackControl, incr);
loopTransform.cpp:
! if (must_reason_predicate) {
! if (reason != Deoptimization::Reason_none) {
Shouldn't that really be reason == Deoptimization::Reason_predicate? That the only one that expects the opaque node.
Why does create_new_if_for_predicate have the two extra arguments? They are always passed as NULL, Deoptimization::Reason_predicate.
Overall it looks fine to me. That factoring and sharing of logic is a nice improvement.
tom
On Mar 14, 2011, at 2:54 PM, Vladimir Kozlov wrote:
> It is the first of coming loop opts changes. No benchmarks performance improvement is expected since main loops in our benchmarks have predicates already.
>
> http://cr.openjdk.java.net/~kvn/7008866/webrev
>
> Fixed 7008866: Missing loop predicate for loop with multiple entries
>
> Synopsis is a little misleading since I don't mean irreducible loop entries
> (new code has a check to not add predicates to irreducible loops). I mean there
> could be several entry and backbranch paths to loop head.
>
> Currently loop predicates are generated when each backbranch path is parsed. Later in IdealLoopTree::beautify_loops() a merge region will be created if there are several entry paths separating predicates from the loop. As result those predicates will be removed.
>
> Add predicates when loop head bytecode is parsed instead of when back branch
> bytecode is parsed. All fall in paths will be merged already at this point and
> for back branches a new merge region is created.
>
> Add missing loop predicate when there are back branches to the method entry
> first bytecode.
>
> Add missing predicates for loops generated in Ideal graph, for example, for
> intrinsics.
>
> Rearrange some code to help next loop optimization changes. For example, in
> PhaseIdealLoop::is_counted_loop() move bailout checks before new ideal nodes are
> generated. Add new counted loop verification code.
>
> Perform local Ideal transformation for parallel induction variables replacement
> since in most cases they use the same stride (ratio == 1).
>
> In PhaseIdealLoop::split_thru_phi() don't move split node (or existing node
> returned by Identity()) inside a loop if all its uses are outside of this loop.
> Otherwise the node will be cloned for each outside use and this will mess up an
> external canonical counted loop if the node is loop's increment, for example.
>
> Preserve unswitch count when partial peel is executed and when a loop is
> converted to counted.
>
> Add debug flag TraceLoopOpts to show executed loop optimizations and also print
> whole loop tree at the beginning of each iteration of loop optimizations:
>
> PartialPeel Loop: N22966/N22965
>
> Tested: ctw, nsk, jprt
> Ran refworkload on x86 - nor regression (or improvement).
>
More information about the hotspot-compiler-dev
mailing list