RFR: 8173709: Fix VerifyLoopOptimizations - step 1 - minimal infrastructure [v6]

Tobias Hartmann thartmann at openjdk.org
Mon Apr 3 05:51:22 UTC 2023


On Thu, 30 Mar 2023 07:26:54 GMT, Emanuel Peter <epeter at openjdk.org> wrote:

>> I am reviving `-XX:+VerifyLoopOptimizations` after many years of abandonment. There were many bugs filed, but so far it has not been addressed.
>> 
>> The hope is that this work will allow us to catch ctrl / idom / loop body bugs quicker, and fix many of the existing ones along the way.
>> 
>> **The Idea of VerifyLoopOptimizations**
>> Before loop-opts, we build many data-structures for dominance (idom), control, and loop membership. Then, loop-opts use this data to transform the graph. At the same time, they must maintain the correctness of the data-structures, so that other optimizations can be made, without needing to re-compute the data-structures every time.
>> `VerifyLoopOptimizations` was implemented to verify correctness of the data-structures. After some loop-opts, we re-compute a verification data-structure and compare it to the one we created before the loop-opts and maintained during loopopts.
>> 
>> **My Approach**
>> I soon realized that there were many reasons why `VerifyLoopOptimizations` was broken. It seemed infeasible to fix all of them at once. I decided to first remove any part that was failing, until I have a minimal set that is working. I will leave many parts commented out. In follow-up RFE's, I will then iteratively improve the verification by re-enabling some verification and fixing the corresponding bugs.
>> 
>> **What I fixed**
>> 
>>  - `verify_compare`
>>    - Renamed it to `verify_idom_and_nodes`, since it does verification node-by-node (vs `verify_tree`, which verifies the loop-tree).
>>    - Previously, it was implemented as a BFS with recursion, which lead to stack-overflow. I flattened the BFS into a loop.
>>    - The BFS calls `verify_idom` and `verify_nodes` on every node. I refactored `verify_nodes` a bit, so that it is more readable.
>>    - I now report all failures, before asserting.
>>  - `verify_tree`
>>    - I corrected the style and improved comments.
>>    - I removed the broken verification for `Opaque` nodes. I added some rudamentary verification for `CountedLoop`. I leave more of this work for follow-up RFE's.
>>    - I also converted the asserts to reporting failures, just like in `verify_idom_and_nodes`.
>> 
>> **Disabled Verifications**
>> I commented out the following verifications:
>> 
>> (A) data nodes should have same ctrl
>> (B) ctrl node should belong to same loop
>> (C) ctrl node should have same idom
>> (D) loop should have same tail
>> (E) loop should have same body (list of nodes)
>> (F) broken verification in PhaseIdealLoop::build_loop_late_post, because ctrl was set wrong
>> 
>> 
>> Note: verifying `idom`, `ctrl` and `_body` is the central goal of `VerifyLoopOptimizations`. But all of them are broken in many parts of the VM, as we have now not verified them for many years.
>> 
>> **Follow-Up Work**
>> 
>> I filed a first follow-up RFE [JDK-8305073](https://bugs.openjdk.org/browse/JDK-8305073). The following tasks should be addressed in it, or in subsequent follow-up RFE's.
>> 
>> I propose the following order:
>> 
>>  - idom (C): The dominance structure is at the base of everything else.
>>  - ctrl / loop (A, B): Once dominance is fixed, we can ensure every node is assigned to the correct ctrl/loop.
>>  - tail (D): ensure the tail of a loop is updated correctly
>>  - body (E): nodes are assigned to the `_body` of a loop, according to the node ctrl.
>>  - other issues like (F)
>>  - Add more verification to IdealLoopTree::verify_tree. For example zero-trip-guard, etc.
>>  - Evaluate from where else we should call `PhaseIdealLoop::verify`. Maybe we are missing some cases.
>> 
>> **Testing**
>> I am running `tier1-tier6` and stress testing.
>> Preliminary results are all good.
>> 
>> **Conclusion**
>> With this fix, I have the basic infrastructure of the verification working.
>> However, all of the substantial verification are now still disabled, because there are too many places in the VM that do not maintain the data-structures properly.
>> Follow-up RFE's will have to address these one-by-one.
>
> Emanuel Peter has updated the pull request incrementally with one additional commit since the last revision:
> 
>   fix typo

Looks good to me.

src/hotspot/share/opto/loopnode.cpp line 4450:

> 4448:     return;
> 4449:   }
> 4450:   DEBUG_ONLY( if(VerifyLoopOptimizations) { verify(); } );

Suggestion:

  DEBUG_ONLY( if (VerifyLoopOptimizations) { verify(); } );

src/hotspot/share/opto/loopnode.cpp line 4522:

> 4520:     visited.clear();
> 4521:     split_if_with_blocks( visited, nstack);
> 4522:     DEBUG_ONLY( if(VerifyLoopOptimizations) { verify(); } );

Suggestion:

    DEBUG_ONLY( if (VerifyLoopOptimizations) { verify(); } );

-------------

Marked as reviewed by thartmann (Reviewer).

PR Review: https://git.openjdk.org/jdk/pull/13207#pullrequestreview-1368314113
PR Review Comment: https://git.openjdk.org/jdk/pull/13207#discussion_r1155498928
PR Review Comment: https://git.openjdk.org/jdk/pull/13207#discussion_r1155499010


More information about the hotspot-compiler-dev mailing list