Complexity reduction when choosing the best inference leaf to be solved

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Sun Oct 15 21:04:47 UTC 2017


Thanks - as I said I already have a fix for this - I will submit this soon.

Maurizio


On 15/10/17 12:48, B. Blaser wrote:
> On 13 October 2017 at 21:59, Maurizio Cimadamore
> <maurizio.cimadamore at oracle.com> wrote:
>> Hi,
>> I think the affected area is close to this:
>>
>> https://bugs.openjdk.java.net/browse/JDK-8178150
> Quoting from your JBS comment, here are the two stuck expressions:
>
> * LOGGER::info - input vars = { C }, output vars = { }
> * iterable -> "" - input vars = { T1 }, output vars = { T2 }
>
> The problem here is that the input var 'C' is influenced by the output
> var 'T2' via the bound set of 'C' which doesn't seem to be currently
> implemented in javac.
>
> I wrote a fix, here under, that adds the corresponding dependencies
> before computing the acyclic stuck graph in
> 'DeferredAttr.pickDeferredNode()'.
>
> I tried this fix using the "lazy" leaf heuristic (the last one I
> suggested) that picks a node to be solved in O(log(n)).
>
> Note that this fix shouldn't interfere with any leaf solving heuristic
> so that it should be possible to choose the best one between:
> * the current one (with optimization?) that chooses the smallest subtree
> * the "lazy" one that minimizes the effort to choose a leaf in O(log(n))
> * the "conservative" one (from Vicente) that picks the nearest leaf
> * or any other heuristic like the "aggressive" one
>
> Does this fix look reasonable to you?
>
> Cheers,
> Bernard
>
>
> diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/DeferredAttr.java
> b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/DeferredAttr.java
> --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/DeferredAttr.java
> +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/DeferredAttr.java
> @@ -29,6 +29,8 @@
>   import com.sun.source.tree.NewClassTree;
>   import com.sun.tools.javac.code.*;
>   import com.sun.tools.javac.code.Type.StructuralTypeMapping;
> +import com.sun.tools.javac.code.Type.UndetVar;
> +import com.sun.tools.javac.code.Type.UndetVar.InferenceBound;
>   import com.sun.tools.javac.code.Types.TypeMapping;
>   import com.sun.tools.javac.comp.ArgumentAttr.LocalCacheContext;
>   import com.sun.tools.javac.comp.Resolve.ResolveError;
> @@ -668,10 +670,15 @@
>               //the intersection between A's input variable and B's
> output variable is non-empty.
>               for (StuckNode sn1 : nodes) {
>                   for (Type t : sn1.data.deferredStuckPolicy.stuckVars()) {
> +                    UndetVar uv = (UndetVar)inferenceContext.asUndetVar(t);
>                       for (StuckNode sn2 : nodes) {
> -                        if (sn1 != sn2 &&
> sn2.data.deferredStuckPolicy.depVars().contains(t)) {
> +                        if (sn1 == sn2) continue;
> +
> +                        Set<Type> depVars =
> sn2.data.deferredStuckPolicy.depVars();
> +
> +                        if (depVars.contains(t) || Type.containsAny(
> +
> uv.getBounds(InferenceBound.values()), List.from(depVars)))
>                               sn1.deps.add(sn2);
> -                        }
>                       }
>                   }
>               }
>
>
>> for which I have a fix in the work which I will submit for review soon.
>>
>> After that fix is in, we can consider deeper refactorings in the area.
>>
>> Cheers
>> Maurizio



More information about the compiler-dev mailing list