[9] RFR(S): 8174164: SafePointNode::_replaced_nodes breaks with irreducible loops
Roland Westrelin
rwestrel at redhat.com
Tue Feb 14 10:13:52 UTC 2017
> I assume test_helper() is inlined into test() in all these
> cases. Right?
Yes.
> Why we do replacement on exit of method inlined() which not have any
> code? Should we do it in Call node map before we inline and parse it?
replaced nodes were introduced for this code pattern:
static void inlined1(Object o) {
A a = (A)o;
}
static void inlined2(Object o) {
inlined1(o);
}
static void inlined3(Object o) {
inlined2(o);
}
static void test(Object o) {
inlined3(o);
// use o that benefit from knowing it's of type A
}
This works if we propagate the replaced nodes at the end of parsing.
> Is not this bad (not inlining)?
Sure it's a bad thing. But then again it works by accident because there
happens to be a call to inlined(). What would be nice is that the
virtual call be inlined with or without the call to inlined() (apply
replaced nodes after the load?).
> But I think it is smaller number of cases vs current fix. Also most
> OSR methods are recompiled as normal nmethods so affect will be only
> temporary.
My test case is pretty simple and it results in irreducible
loops. Replaced nodes were added for nashorn and I remember they had
simple scripts with a loop that would only get OSR compiled. Anyway,
here is the fix with a check for irreducible loops:
http://cr.openjdk.java.net/~roland/8174164/webrev.01/
Roland.
More information about the hotspot-compiler-dev
mailing list