RFR: 8255670: Improve C2's detection of modified nodes

Emanuel Peter epeter at openjdk.org
Wed Sep 14 08:47:07 UTC 2022


On Tue, 13 Sep 2022 12:56:06 GMT, Roland Westrelin <roland at openjdk.org> wrote:

>> Added `record_modified_node` to:
>> 
>> Node::clone
>> Node::add_req
>> Node::add_req_batch
>> Node::ins_req
>> Node::add_prec
>> Node::rm_prec
>> Node::set_prec
>> 
>> 
>> Added `igvn->_worklist.push(node)` in various places that modified a `node` but did not add it to the igvn worklist.
>> 
>> 7 times I had to push `Root`, 5 of these it was because of the creation of a `HaltNode`, which means we have a `root->add_req(halt)`. 
>> 
>> In one case we have a MergeMemStream node, which gets two MergeMem nodes as input, and streams over them.
>> Unfortunately, it modifies one of the two, which then can trigger our assertion code. I now push this node to the igvn worklist, but a better fix would be to make MergeMemStream leave the MergeMem nodes unmodified. I think that should be possible, filed an RFE [JDK-8293358](https://bugs.openjdk.org/browse/JDK-8293358)
>> 
>> FYI:
>> What I am NOT doing here, and leave to a future RFE/independent change: investigate / implement these assertions for late/incremental inlining.
>> 
>> Ran larger regression tests, and 7-9h of fuzzing on 3 platforms.
>
> src/hotspot/share/opto/loopnode.cpp line 5135:
> 
>> 5133:           set_loop(halt, l);
>> 5134:           C->root()->add_req(halt);
>> 5135:           _igvn._worklist.push(C->root());
> 
> Maybe add a method to PhaseIterGVN that does the add_req + push similar to replace_input_of?

@rwestrel Thanks for the suggestion, I will do that

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

PR: https://git.openjdk.org/jdk/pull/9439


More information about the hotspot-compiler-dev mailing list