RFR: 8289943: Simplify some object allocation merges

Cesar Soares duke at openjdk.org
Fri Jul 15 23:08:20 UTC 2022


On Thu, 14 Jul 2022 23:32:32 GMT, Xin Liu <xliu at openjdk.org> wrote:

>> Hi there, can I please get some feedback on this approach to simplify object allocation merges in order to promote Scalar Replacement of the objects involved in the merge?
>> 
>> The basic idea for this [approach was discussed in this thread](https://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/2022-April/055189.html) and it consists of: 
>> 1) Identify Phi nodes that merge object allocations and replace them with a new IR node called ReducedAllocationMergeNode (RAM node).
>> 2) Scalar Replace the incoming allocations to the RAM node.
>> 3) Scalar Replace the RAM node itself.
>> 
>> There are a few conditions for doing the replacement of the Phi by a RAM node though - Although I plan to work on removing them in subsequent PRs:
>> 
>> - ~~The original Phi node should be merging Allocate nodes in all inputs.~~
>> - The only supported users of the original Phi are AddP->Load, SafePoints/Traps, DecodeN.
>> 
>> These are the critical parts of the implementation and I'd appreciate it very much if you could tell me if what I implemented isn't violating any C2 IR constraints:
>> 
>> - The way I identify/use the memory edges that will be used to find the last stored values to the merged object fields.
>> - The way I check if there is an incoming Allocate node to the original Phi node.
>> - The way I check if there is no store to the merged objects after they are merged.
>> 
>> Testing:
>> - Linux. fastdebug -> hotspot_all, renaissance, dacapo
>
> I run into an error 
> 
> $make test TEST=compiler/c2/irTests/scalarReplacement/AllocationMergesTests.java  CONF=linux-x86_64-server-fastdebug
> 
> 
> One or more @IR rules failed:
> 
> Failed IR Rules (1) of Methods (1)
> ----------------------------------
> 1) Method "int compiler.c2.irTests.scalarReplacement.AllocationMergesTests.testPollutedPolymorphic(boolean,int)" - [Failed IR rules: 1]:
>    * @IR rule 1: "@compiler.lib.ir_framework.IR(applyIf={}, applyIfAnd={}, failOn={}, applyIfOr={}, counts={"(.*precise .*\\R((.*(?i:mov|xorl|nop|spill).*|\\s*|.*LGHI.*)\\R)*.*(?i:call,static).*wrapper for: _new_instance_Java)", "2"}, applyIfNot={})"
>      - counts: Graph contains wrong number of nodes:
>        * Regex 1: (.*precise .*\R((.*(?i:mov|xorl|nop|spill).*|\s*|.*LGHI.*)\R)*.*(?i:call,static).*wrapper for: _new_instance_Java)
>          - Failed comparison: [found] 0 = 2 [given]
>          - No nodes matched!
> 
>>>> Check stdout for compilation output of the failed methods
> 
> 
>   #############################################################
>    - To only run the failed tests use -DTest, -DExclude,
>      and/or -DScenarios.
>    - To also get the standard output of the test VM run with
>      -DReportStdout=true or for even more fine-grained logging
>      use -DVerbose=true.
>   #############################################################
> 
> 
> compiler.lib.ir_framework.driver.irmatching.IRViolationException: There were one or multiple IR rule failures. Please check stderr for more information.
>         at compiler.lib.ir_framework.driver.irmatching.IRMatcher.throwIfNoSafepointWhilePrinting(IRMatcher.java:91)
>         at compiler.lib.ir_framework.driver.irmatching.IRMatcher.reportFailures(IRMatcher.java:82)
>         at compiler.lib.ir_framework.driver.irmatching.IRMatcher.applyIRRules(IRMatcher.java:54)
>         at compiler.lib.ir_framework.driver.irmatching.IRMatcher.<init>(IRMatcher.java:43)
>         at compiler.lib.ir_framework.TestFramework.runTestVM(TestFramework.java:729)
>         at compiler.lib.ir_framework.TestFramework.start(TestFramework.java:698)
>         at compiler.lib.ir_framework.TestFramework.start(TestFramework.java:329)
>         at compiler.lib.ir_framework.TestFramework.runWithFlags(TestFramework.java:237)
>         at compiler.c2.irTests.scalarReplacement.AllocationMergesTests.main(AllocationMergesTests.java:37)
>         at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
>         at java.base/java.lang.reflect.Method.invoke(Method.java:578)
>         at com.sun.javatest.regtest.agent.MainActionHelper$AgentVMRunnable.run(MainActionHelper.java:312)
>         at java.base/java.lang.Thread.run(Thread.java:1596)
> 
> 
> 2 objects do get scalarized in `testPollutedPolymorphic`.

Thanks for taking a look @navyxliu . I'm working on an improvement (and fixing a bug) and I'll include your suggestions in the next push.

> src/hotspot/share/opto/escape.cpp line 647:
> 
>> 645:   _igvn->_worklist.push(ram);
>> 646: 
>> 647: //  if (n->_idx == 257 && ram->_idx == 1239) {
> 
> some mysterious code? :)

Oops (no pun intended).

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

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


More information about the hotspot-compiler-dev mailing list