Request for reviews (S): 6973329: C2 with Zero based COOP produces code with broken anti-dependency on x86
vladimir.kozlov at oracle.com
Tue Aug 10 11:17:39 PDT 2010
Fixed 6973329: C2 with Zero based COOP produces code with broken anti-dependency on x86
Main problem: RA ignores anti-dependence when placing a clone of
a node which produces flags (or any rematerializable nodes).
The code generating implicit_null_check may move such nodes
above nodes modifying flags which will force RA to clone it.
Recompile without subsuming loads if RA try to clone a node with anti_dependence.
Do not use nodes which produce flags in implicit null checks.
Added regression test based on failure I saw in SPECjEnterprise2010.
I collected statistic about how many dependences are found per
each call to insert_anti_dependences(). And how many recompilation
without subsuming loads and total bailout happened in new RA code.
1431559 made anti_dependence checks, 5497392 found anti_dependences (384%),
128477 did not find anti_dependences ( 8%)
200020 made anti_dependence checks, 724530 found anti_dependences (362%),
10339 did not find anti_dependences ( 5%)
Originally I thought about adding new Node flag has_anti_dependence which I
would set in insert_anti_dependences() and check it in the clone_node() in RA.
But looking on this statistic I decided to use existing flag
needs_anti_dependence_check. After that number of recompilation without
subsuming loads changed from 115 to 127 (in CTW rt.jar). I think it is acceptable.
Next I found that this recompilation number could be significantly reduced
if I exclude nodes which produce flags from implicit null checks.
RA: 127 recompile without subsume_loads, 0 bailout compilation
RA: 140 recompile without subsume_loads, 0 bailout compilation
RA: 39 recompile without subsume_loads, 0 bailout compilation
RA: 3 recompile without subsume_loads, 0 bailout compilation
More information about the hotspot-compiler-dev