From f3cd1289c4844492ad38520c8fe31d5a771f122c Mon Sep 17 00:00:00 2001 From: Zbynek Slajchrt <zbynek.slajchrt@oracle.com> Date: Fri, 9 Sep 2016 12:26:10 +0200 Subject: [PATCH] "Dead" specializations detected by rbdiag --- .../r/nodes/test/RBuiltinDiagnostics.java | 34 ++++++++++++++++--- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/com.oracle.truffle.r.nodes.test/src/com/oracle/truffle/r/nodes/test/RBuiltinDiagnostics.java b/com.oracle.truffle.r.nodes.test/src/com/oracle/truffle/r/nodes/test/RBuiltinDiagnostics.java index e9079da634..1506abfd75 100644 --- a/com.oracle.truffle.r.nodes.test/src/com/oracle/truffle/r/nodes/test/RBuiltinDiagnostics.java +++ b/com.oracle.truffle.r.nodes.test/src/com/oracle/truffle/r/nodes/test/RBuiltinDiagnostics.java @@ -27,6 +27,8 @@ import java.lang.reflect.Modifier; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -35,6 +37,8 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +import javax.imageio.metadata.IIOInvalidTreeException; + import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.r.nodes.access.variables.ReadVariableNode; @@ -222,6 +226,8 @@ public class RBuiltinDiagnostics { System.out.println("\nUnhandled argument combinations: " + nonCoveredArgsSet.size()); System.out.println(""); + printDeadSpecs(); + if (diagSuite.diagConfig.verbose) { for (List<Type> uncoveredArgs : nonCoveredArgsSet) { System.out.println(uncoveredArgs.stream().map(t -> typeName(t)).collect(Collectors.toList())); @@ -229,6 +235,26 @@ public class RBuiltinDiagnostics { } } + private void printDeadSpecs() { + System.out.println("Dead specializations: "); + for (Map.Entry<Method, List<Set<Cast>>> resTpPerSpec : convResultTypePerSpec.entrySet()) { + List<Set<Cast>> argsCasts = resTpPerSpec.getValue(); + List<Integer> missingCasts = new ArrayList<>(); + for (int i = 0; i < argsCasts.size(); i++) { + Set<Cast> argCasts = argsCasts.get(i); + if (argCasts.isEmpty()) { + missingCasts.add(i); + } + } + + if (!missingCasts.isEmpty()) { + System.out.println(" " + methodName(resTpPerSpec.getKey(), missingCasts)); + } + } + + System.out.println(""); + } + protected void diagnosePipeline(int i) { TypeExpr argResultSet = argResultSets.get(i); System.out.println("\n Pipeline for '" + parameterNames[i] + "' (arg[" + i + "]):"); @@ -243,7 +269,7 @@ public class RBuiltinDiagnostics { argCastInSpec.stream().forEach( partialCast -> { System.out.println(" " + partialCast.coverage() + " (" + typeName(partialCast.inputType()) + "->" + typeName(partialCast.resultType()) + ")" + " in " + - methodName(entry.getKey(), curParIndex)); + methodName(entry.getKey(), Collections.singleton(curParIndex))); unboundArgTypes.remove(partialCast.inputType()); }); } @@ -296,13 +322,13 @@ public class RBuiltinDiagnostics { } } - private static String methodName(Method m, int markedParamIndex) { - final int markedParamRealIndex = getRealParamIndex(m.getParameterTypes(), markedParamIndex); + private static String methodName(Method m, Collection<Integer> markedParamIndices) { + final Set<Integer> markedParamRealIndices = markedParamIndices.stream().map(markedParamIndex -> getRealParamIndex(m.getParameterTypes(), markedParamIndex)).collect(Collectors.toSet()); StringBuilder sb = new StringBuilder(); int i = 0; for (Class<?> pt : m.getParameterTypes()) { final String tn; - if (i == markedParamRealIndex) { + if (markedParamRealIndices.contains(i)) { tn = "*" + typeName(pt) + "*"; } else { tn = typeName(pt); -- GitLab