comparison graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/CheckCastSnippets.java @ 9793:b4f12c603be5

added support for the runtime to specify for each foreign call whether it is re-executable and what memory locations it kills
author Doug Simon <doug.simon@oracle.com>
date Wed, 22 May 2013 16:27:25 +0200
parents 19c5a07c7843
children 063a712fe8d8
comparison
equal deleted inserted replaced
9792:06dc2d2324d6 9793:b4f12c603be5
29 import static com.oracle.graal.nodes.extended.UnsafeCastNode.*; 29 import static com.oracle.graal.nodes.extended.UnsafeCastNode.*;
30 import static com.oracle.graal.replacements.SnippetTemplate.*; 30 import static com.oracle.graal.replacements.SnippetTemplate.*;
31 import static com.oracle.graal.replacements.nodes.BranchProbabilityNode.*; 31 import static com.oracle.graal.replacements.nodes.BranchProbabilityNode.*;
32 32
33 import com.oracle.graal.api.code.*; 33 import com.oracle.graal.api.code.*;
34 import com.oracle.graal.api.meta.*;
34 import com.oracle.graal.debug.*; 35 import com.oracle.graal.debug.*;
35 import com.oracle.graal.graph.Node.NodeIntrinsic; 36 import com.oracle.graal.graph.Node.NodeIntrinsic;
36 import com.oracle.graal.hotspot.meta.*; 37 import com.oracle.graal.hotspot.meta.*;
37 import com.oracle.graal.nodes.*; 38 import com.oracle.graal.nodes.*;
38 import com.oracle.graal.nodes.java.*; 39 import com.oracle.graal.nodes.java.*;
92 public static Object checkcastPrimary(Word hub, Object object, @ConstantParameter int superCheckOffset, @ConstantParameter boolean checkNull) { 93 public static Object checkcastPrimary(Word hub, Object object, @ConstantParameter int superCheckOffset, @ConstantParameter boolean checkNull) {
93 if (checkNull && probability(NOT_FREQUENT_PROBABILITY, object == null)) { 94 if (checkNull && probability(NOT_FREQUENT_PROBABILITY, object == null)) {
94 isNull.inc(); 95 isNull.inc();
95 } else { 96 } else {
96 Word objectHub = loadHub(object); 97 Word objectHub = loadHub(object);
97 if (objectHub.readWord(superCheckOffset, FINAL_LOCATION).notEqual(hub)) { 98 if (objectHub.readWord(superCheckOffset, LocationIdentity.FINAL_LOCATION).notEqual(hub)) {
98 displayMiss.inc(); 99 displayMiss.inc();
99 DeoptimizeNode.deopt(InvalidateReprofile, ClassCastException); 100 DeoptimizeNode.deopt(InvalidateReprofile, ClassCastException);
100 } 101 }
101 displayHit.inc(); 102 displayHit.inc();
102 } 103 }
185 } else { 186 } else {
186 ConstantNode[] hints = createHints(hintInfo, runtime, true, graph).hubs; 187 ConstantNode[] hints = createHints(hintInfo, runtime, true, graph).hubs;
187 args = new Arguments(secondary); 188 args = new Arguments(secondary);
188 args.add("hub", hub); 189 args.add("hub", hub);
189 args.add("object", object); 190 args.add("object", object);
190 args.addVarargs("hints", Word.class, StampFactory.forKind(wordKind()), hints); 191 args.addVarargs("hints", Word.class, StampFactory.forKind(getWordKind()), hints);
191 } 192 }
192 args.addConst("checkNull", !object.stamp().nonNull()); 193 args.addConst("checkNull", !object.stamp().nonNull());
193 194
194 SnippetTemplate template = template(args); 195 SnippetTemplate template = template(args);
195 Debug.log("Lowering checkcast in %s: node=%s, template=%s, arguments=%s", graph, checkcast, template, args); 196 Debug.log("Lowering checkcast in %s: node=%s, template=%s, arguments=%s", graph, checkcast, template, args);