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