Complexity reduction when choosing the best inference leaf to be solved
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Fri Oct 13 09:08:15 UTC 2017
On 12/10/17 22:27, Vicente Romero wrote:
>
>
> On 10/12/2017 04:16 PM, Maurizio Cimadamore wrote:
>>
>>
>>
>> On 12/10/17 20:04, Vicente Romero wrote:
>>> This is my interpretation of this problem and how I think we should
>>> discuss if this interpretation is correct, or if there is a better
>>> one, before considering optimizing the current implementation which
>>> doesn't fit very well into any of these descriptions strategies.
>> I think your interpretation of the problem is correct. This is the
>> dual of the max flow problem, with some variations (as you note). I'm
>> not sure about the aggressive strategy you propose; it seems like it
>> could get fooled quite easily if a flow with an high overall cost is
>> 'hidden' behind a leaf with an initial very low cost. As per your
>> point (2), yes it will typically be the case that the var to
>> instantiate is not a leaf, which is why we try to come up with the
>> best set of variables to instantiate eagerly - knowing that each
>> (redundant) eager instantiation could potentially lead to spurious
>> error messages.
>>
>> That said, this part is outside the spec - as section 18.5.2.2 says this:
>>
>> "1 A subset of constraints is selected in C, satisfying the property
>> that, for each constraint, no input variable can influence an output
>> variable of another constraint in C. The terms /input variable/ and
>> /output variable/ are defined below. An inference variable α /can
>> influence/ an inference variable β if α depends on the resolution of
>> β (§18.4
>> <https://docs.oracle.com/javase/specs/jls/se9/html/jls-18.html#jls-18.4>),
>> or vice versa; or if there exists a third inference variable γ such
>> that α can influence γ and γ can influence β.
>>
>> 2 The selected constraint(s) are removed from C.
>>
>> 3 The input variables α1, ..., αm of all the selected constraint(s)
>> are resolved.""
>>
>> Here javac is playing some tricks that are totally outside of the
>> spec - note that the spec requires that all input inference variables
>> in the node to be unstuck should be solved at once - but that's not
>> what javac does - as javac calls solveAny to do the heuristic trick:
>>
>> http://hg.openjdk.java.net/jdk10/master/file/tip/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/DeferredAttr.java#l635
>>
>> I think that, instead of investing resources on making these tricks
>> more optimal, we should probably try to bring the compiler closer to
>> what the spec has to say in this matter (or at least try and see what
>> breaks, if anything).
>
> Or this is probably one of those cases in which the spec should mimic
> what javac is doing
I was thinking more about it, and yes, there can be cases where the
spec is overly eager; consider a couple of constraints like C1 and C2:
vars(C1) = I1, O1
input(C1) = I1
output(C1) = O1
vars(C2) = I2, O2
input(C2) = I2
output(C2) = O2
T can influence I1
U can influence I1
V can influence U
In this case, it's fine to pick C1 as the first constraint to solve - as
its input variables (I1) do not influence any output var (O1, O2) of any
other constraints.
So, now we have to solve all input vars of C2 - namely I1. Which means,
now we have to turn at the 'can-influence' relationship, and ask 'what
are the variables I need to solve in order to get at I1' ? I believe
this question has only one answer that is 'minimal'. In other words,
there should be only a minimal subset of the graph that goes from one or
more leaves and lead to I1. In the example above, such subset is { T, U,
V, I1 }.
Of course there are more non-minimal choices:
{ T, U, V, I1, O1 }
{ T, U, V, I1, O2 }
{ T, U, V, I1, O1, O2 }
But I think there's only _one_ minimal answer. So, the way I see the
javac implementation, is that the BestLeafSolver is a big workaround to
the fact that we need to be able to solve a 'subset' of the inference
graph. But this can be achieved in many different ways - and the
approach implemented right now (which predates the spec text) is
probably more general than it needs to.
I think a very simple BestLeafSolver would simply 'skip' all the
inference graph nodes which cannot influence any of the nodes containing
at least one variable in the target set, and will keep going until all
variables in such set are solved. I don' think such an algorithm would
require any tracking of cost, paths and such.
Maurizio
>
>>
>> Cheers
>> Maurizio
>>
>>
>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20171013/34b6d62c/attachment.html>
More information about the compiler-dev
mailing list