[lworld] RFR: 8246603: [lworld] C2 does not scalarize inline types wrapped into non-escaping box objects
Tobias Hartmann
thartmann at openjdk.java.net
Tue Jun 9 14:33:43 UTC 2020
C2 fails to scalarize inline types wrapped into non-inline, non-escaping (box) objects.
For example, in TestLWorld::test109, C2 successfully scalar replaces the InterfaceBox object but not the LongWrapper
object it contains because of the complex control flow in LongWrapper::wrap. However, since LongWrapper is an inline
type, we don't need to rely on Escape Analysis to be able to scalar replace. Now the problem is that LongWrapper is
stored as oop in a field of type WrapperInterface and we don't keep track of the ValueType(Ptr)Node long enough (i.e.
until after EA) for the load to be removed and the buffer allocation to go away.
The fix contains the following changes:
- Use ValueTypePtrNode instead of the oop whenever possible to keep track of field values. PhiNode::Ideal will then push
such ValueTypePtrNode down and LoadNode::Identity will fold the loads.
- Keep ValueTypePtrNodes such that we can still fold loads after EA removed potential non-inline, wrapper objects that
prevented scalarization during parsing. Only remove them after EA is done.
- Piggy-backing on PhaseMacroExpand::eliminate_allocate_node to eliminate unused inline type allocations and removed
Allocate::Ideal which is not needed anymore (it also did not remove allocations that still had initializing stores).
- Added code to remove the membar added after inline type allocation (it will otherwise block loop opts).
- Make sure phis are always split if all inputs are mergemems to remove useless memory merges that block optimizations
(see JDK-8247216)
- Added regression tests and a benchmark (provided by Maurizio)
Performance without fix:
Benchmark Mode Cnt Score Error Units
TestBoxing.pojo_loop avgt 30 4.699 ± 0.045 ms/op
TestBoxing.box_generic_loop avgt 30 4.540 ± 0.058 ms/op
TestBoxing.box_inline_loop avgt 30 0.527 ± 0.009 ms/op
TestBoxing.box_intf_loop avgt 30 4.512 ± 0.050 ms/op
TestBoxing.box_ref_loop avgt 30 4.551 ± 0.037 ms/op
TestBoxing.inline_loop avgt 30 0.524 ± 0.013 ms/op
Performance with fix:
Benchmark Mode Cnt Score Error Units
TestBoxing.pojo_loop avgt 30 4.818 ± 0.166 ms/op
TestBoxing.box_generic_loop avgt 30 0.517 ± 0.007 ms/op
TestBoxing.box_inline_loop avgt 30 0.513 ± 0.007 ms/op
TestBoxing.box_intf_loop avgt 30 0.523 ± 0.024 ms/op
TestBoxing.box_ref_loop avgt 30 0.511 ± 0.010 ms/op
TestBoxing.inline_loop avgt 30 0.514 ± 0.012 ms/op
-------------
Commit messages:
- 8246603: [lworld] C2 does not scalarize inline types wrapped into non-escaping box objects
Changes: https://git.openjdk.java.net/valhalla/pull/71/files
Webrev: https://webrevs.openjdk.java.net/valhalla/71/webrev.00
Issue: https://bugs.openjdk.java.net/browse/JDK-8246603
Stats: 587 lines in 19 files changed: 432 ins; 91 del; 64 mod
Patch: https://git.openjdk.java.net/valhalla/pull/71.diff
Fetch: git fetch https://git.openjdk.java.net/valhalla pull/71/head:pull/71
PR: https://git.openjdk.java.net/valhalla/pull/71
More information about the valhalla-dev
mailing list