Complexity reduction when choosing the best inference leaf to be solved

Vicente Romero vicente.romero at oracle.com
Fri Oct 13 12:31:06 UTC 2017



On 10/13/2017 05:08 AM, Maurizio Cimadamore wrote:
>
>
>
> 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.

well I think that there are two parts here, one is finding that minimal 
set that could be done using a simple flood fill algorithm in the graph, 
just connectivity matters. But then once we have the subset, we have to 
find a resolution order right? After the application of the Tarjan algo 
for strongly connected components, the graph is already topologically 
sorted. The subset found in step 1 will also be sorted we can follow 
that order.

>
> Maurizio

Vicente

>>
>>>
>>> Cheers
>>> Maurizio
>>>
>>>
>>>
>>>
>>>
>>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20171013/b7164bb7/attachment.html>


More information about the compiler-dev mailing list