RFC: C2: Anti-dependence on a load with a control in presence of a membar
Vladimir Ivanov
vladimir.x.ivanov at oracle.com
Fri Mar 2 14:47:45 UTC 2018
Hi,
I'm seeing unschedulable graph being produced during GCM when adding
anti-dependence to a load node with a control dependency. I found the
root cause, but can't decide how to fix it.
Here are steps which lead to the broken graph:
(1) The load causing problems (#391) is added as part of specializing
ArrayCopy for small arrays (added as part of JDK-6912521 [1] in 9). Both
control & memory are tied to AllocateArray. (IR [2])
(2) EA proves that AllocateArray (#363, destination) is scalar
replaceable and during split_unique_types() updates corresponding
MemoryMerge (#379) and it allows to directly use memory produced by
ArrayCopy (#255, source) bypassing the allocation & membar (#348). (IR [3])
(3) After allocation elimination, the load control dependency is
switched to MemBarCPUOrder (#348) which was immediate dominator of
eliminated allocation (IR [4])
(4) After matching the load has control on the membar, but not memory
(IR before [5] and after [6] matching.)
(5) During GCM, anti-dependence from membar (#317) to the load is
added, but it makes the graph unschedulable which then triggers the
assertion [7] during LCM.
Relevant places in the code: [8]
Everything looks fine, except updates of MergeMems in step #2:
* the load is pinned to the proper branch after deciding what
direction to go;
* wide membars do need anti-dependences on loads
So, as a fix I'd disable memory edge updates which bypass any membars.
Does it sound reasonable or am I missing something important?
Best regards,
Vladimir Ivanov
[1] https://bugs.openjdk.java.net/browse/JDK-6912521
[2] http://cr.openjdk.java.net/~vlivanov/misc/antidep/01_initial.png
[3]
http://cr.openjdk.java.net/~vlivanov/misc/antidep/02_ea_split_unique_types.png
[4]
http://cr.openjdk.java.net/~vlivanov/misc/antidep/03_after_alloc_elimination.png
[5] http://cr.openjdk.java.net/~vlivanov/misc/antidep/04_before_matching.png
[6] http://cr.openjdk.java.net/~vlivanov/misc/antidep/05_after_matching.png
[7]
# Internal Error
(/Users/vlivanov/ws/jdk/panama-dev/open/src/hotspot/share/opto/lcm.cpp:1169),
pid=90414, tid=14851
# assert(false) failed: graph should be schedulable
[8] http://cr.openjdk.java.net/~vlivanov/misc/antidep/webrev/
More information about the hotspot-compiler-dev
mailing list