diff graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/SnippetTemplate.java @ 5482:9f4783c0269e

folded -G:+CheckcastCounters functionality into checkcast snippets fixed bug in translation of @Parameter(multiple = true) parameters modified commands.py to appease jacoco
author Doug Simon <doug.simon@oracle.com>
date Wed, 06 Jun 2012 18:04:07 +0200
parents e26e6dca0bcf
children f70b1547c7bf 82f44f47e1aa
line wrap: on
line diff
--- a/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/SnippetTemplate.java	Tue Jun 05 21:43:42 2012 +0200
+++ b/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/SnippetTemplate.java	Wed Jun 06 18:04:07 2012 +0200
@@ -35,6 +35,7 @@
 import com.oracle.graal.lir.cfg.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.java.*;
+import com.oracle.graal.nodes.type.*;
 import com.oracle.graal.nodes.util.*;
 import com.oracle.graal.snippets.Snippet.Arguments;
 import com.oracle.graal.snippets.Snippet.Constant;
@@ -158,6 +159,7 @@
 
         int parameterCount = signature.argumentCount(false);
         Parameter[] parameterAnnotations = new Parameter[parameterCount];
+        ConstantNode[] placeholders = new ConstantNode[parameterCount];
         for (int i = 0; i < parameterCount; i++) {
             Constant c = CiUtil.getParameterAnnotation(Constant.class, i, method);
             if (c != null) {
@@ -176,7 +178,9 @@
                     assert multiple != null : method + ": requires a Multiple named " + name;
                     assert checkMultipleArgument(method, signature, i, name, multiple);
                     Object array = ((Multiple) multiple).array;
-                    replacements.put(snippetGraph.getLocal(i), ConstantNode.forObject(array, runtime, snippetCopy));
+                    ConstantNode placeholder = ConstantNode.forObject(array, runtime, snippetCopy);
+                    replacements.put(snippetGraph.getLocal(i), placeholder);
+                    placeholders[i] = placeholder;
                 }
                 parameterAnnotations[i] = p;
             }
@@ -193,28 +197,36 @@
         for (int i = 0; i < parameterCount; i++) {
             Parameter p = parameterAnnotations[i];
             if (p != null) {
-                ValueNode parameter;
                 if (p.multiple()) {
-                    parameter = null;
                     assert snippetCopy.getLocal(i) == null;
-                    ConstantNode array = (ConstantNode) replacements.get(snippetGraph.getLocal(i));
-                    for (LoadIndexedNode loadIndexed : snippetCopy.getNodes(LoadIndexedNode.class)) {
-                        if (loadIndexed.array() == array) {
+                    Object array = ((Multiple) key.get(p.value())).array;
+                    int length = Array.getLength(array);
+                    LocalNode[] locals = new LocalNode[length];
+                    Stamp stamp = StampFactory.forKind(runtime.getType(array.getClass().getComponentType()).kind(false));
+                    for (int j = 0; j < length; j++) {
+                        assert (parameterCount & 0xFFFF) == parameterCount;
+                        int idx = i << 16 | j;
+                        LocalNode local = snippetCopy.unique(new LocalNode(idx, stamp));
+                        locals[j] = local;
+                    }
+                    parameters.put(p.value(), locals);
+
+                    ConstantNode placeholder = placeholders[i];
+                    assert placeholder != null;
+                    for (Node usage : placeholder.usages().snapshot()) {
+                        if (usage instanceof LoadIndexedNode) {
+                            LoadIndexedNode loadIndexed = (LoadIndexedNode) usage;
                             Debug.dump(snippetCopy, "Before replacing %s", loadIndexed);
-                            LoadMultipleParameterNode lmp = new LoadMultipleParameterNode(array, i, loadIndexed.index(), loadIndexed.stamp());
-                            StructuredGraph g = (StructuredGraph) loadIndexed.graph();
-                            g.add(lmp);
-                            g.replaceFixedWithFixed(loadIndexed, lmp);
-                            parameter = lmp;
+                            LoadSnippetParameterNode loadSnippetParameter = snippetCopy.add(new LoadSnippetParameterNode(locals, loadIndexed.index(), loadIndexed.stamp()));
+                            snippetCopy.replaceFixedWithFixed(loadIndexed, loadSnippetParameter);
                             Debug.dump(snippetCopy, "After replacing %s", loadIndexed);
-                            break;
                         }
                     }
                 } else {
-                    parameter = snippetCopy.getLocal(i);
+                    LocalNode local = snippetCopy.getLocal(i);
+                    assert local != null;
+                    parameters.put(p.value(), local);
                 }
-                assert parameter != null;
-                parameters.put(p.value(), parameter);
             }
         }
 
@@ -274,6 +286,8 @@
 
         new DeadCodeEliminationPhase().apply(snippetCopy);
 
+        assert checkAllMultipleParameterPlaceholdersAreDeleted(parameterCount, placeholders);
+
         this.graph = snippetCopy;
         nodes = new ArrayList<>(graph.getNodeCount());
         ReturnNode retNode = null;
@@ -291,6 +305,15 @@
         this.returnNode = retNode;
     }
 
+    private static boolean checkAllMultipleParameterPlaceholdersAreDeleted(int parameterCount, ConstantNode[] placeholders) {
+        for (int i = 0; i < parameterCount; i++) {
+            if (placeholders[i] != null) {
+                assert placeholders[i].isDeleted() : placeholders[i];
+            }
+        }
+        return true;
+    }
+
     private static boolean checkConstantArgument(final RiResolvedMethod method, RiSignature signature, int i, String name, Object arg, CiKind kind) {
         if (kind.isObject()) {
             Class<?> type = signature.argumentTypeAt(i, method.holder()).resolve(method.holder()).toJava();
@@ -320,9 +343,9 @@
 
     /**
      * The named parameters of this template that must be bound to values during instantiation.
-     * Each parameter is either a {@link LocalNode} or a {@link LoadMultipleParameterNode} instance.
+     * Each value in this map is either a {@link LocalNode} instance or a {@link LocalNode} array.
      */
-    private final Map<String, ValueNode> parameters;
+    private final Map<String, Object> parameters;
 
     /**
      * The return node (if any) of the snippet.
@@ -344,28 +367,28 @@
 
         for (Map.Entry<String, Object> e : args) {
             String name = e.getKey();
-            ValueNode parameter = parameters.get(name);
+            Object parameter = parameters.get(name);
             assert parameter != null : this + " has no parameter named " + name;
             Object argument = e.getValue();
             if (parameter instanceof LocalNode) {
                 if (argument instanceof ValueNode) {
-                    replacements.put(parameter, (ValueNode) argument);
+                    replacements.put((LocalNode) parameter, (ValueNode) argument);
                 } else {
                     CiKind kind = ((LocalNode) parameter).kind();
                     CiConstant constant = CiConstant.forBoxed(kind, argument);
-                    replacements.put(parameter, ConstantNode.forCiConstant(constant, runtime, replaceeGraph));
+                    replacements.put((LocalNode) parameter, ConstantNode.forCiConstant(constant, runtime, replaceeGraph));
                 }
             } else {
-                assert parameter instanceof LoadMultipleParameterNode;
+                assert parameter instanceof LocalNode[];
+                LocalNode[] locals = (LocalNode[]) parameter;
                 Object array = argument;
                 assert array != null && array.getClass().isArray();
-                int length = Array.getLength(array);
-                LoadMultipleParameterNode lmp = (LoadMultipleParameterNode) parameter;
-                assert length == lmp.getLocalCount() : length + " != " + lmp.getLocalCount();
+                int length = locals.length;
+                assert Array.getLength(array) == length : length + " != " + Array.getLength(array);
                 for (int j = 0; j < length; j++) {
-                    LocalNode local = lmp.getLocal(j);
+                    LocalNode local = locals[j];
                     assert local != null;
-                    CiConstant constant = CiConstant.forBoxed(lmp.kind(), Array.get(array, j));
+                    CiConstant constant = CiConstant.forBoxed(local.kind(), Array.get(array, j));
                     ConstantNode element = ConstantNode.forCiConstant(constant, runtime, replaceeGraph);
                     replacements.put(local, element);
                 }
@@ -434,16 +457,18 @@
     public String toString() {
         StringBuilder buf = new StringBuilder(graph.toString()).append('(');
         String sep = "";
-        for (Map.Entry<String, ValueNode> e : parameters.entrySet()) {
+        for (Map.Entry<String, Object> e : parameters.entrySet()) {
             String name = e.getKey();
-            ValueNode value = e.getValue();
+            Object value = e.getValue();
             buf.append(sep);
             sep = ", ";
             if (value instanceof LocalNode) {
-                buf.append(value.kind().name()).append(' ').append(name);
+                LocalNode local = (LocalNode) value;
+                buf.append(local.kind().name()).append(' ').append(name);
             } else {
-                LoadMultipleParameterNode lmp = (LoadMultipleParameterNode) value;
-                buf.append(value.kind().name()).append('[').append(lmp.getLocalCount()).append("] ").append(name);
+                LocalNode[] locals = (LocalNode[]) value;
+                String kind = locals.length == 0 ? "?" : locals[0].kind().name();
+                buf.append(kind).append('[').append(locals.length).append("] ").append(name);
             }
         }
         return buf.append(')').toString();