Mercurial > hg > truffle
comparison graal/com.oracle.max.criutils/src/com/oracle/max/criutils/TypeCheckHints.java @ 5541:b4c406861c33
More renamings to drop Ri* prefix completely. Deleted graph.BitMap class and replaced with java.util.BitSet.
author | Thomas Wuerthinger <thomas.wuerthinger@oracle.com> |
---|---|
date | Sat, 09 Jun 2012 16:52:12 +0200 |
parents | 426c605c9d3c |
children | b6617d13ea44 |
comparison
equal
deleted
inserted
replaced
5540:a891c53a295b | 5541:b4c406861c33 |
---|---|
25 import java.lang.reflect.*; | 25 import java.lang.reflect.*; |
26 import java.util.*; | 26 import java.util.*; |
27 | 27 |
28 import com.oracle.graal.api.code.*; | 28 import com.oracle.graal.api.code.*; |
29 import com.oracle.graal.api.meta.*; | 29 import com.oracle.graal.api.meta.*; |
30 import com.oracle.graal.api.meta.RiTypeProfile.*; | 30 import com.oracle.graal.api.meta.JavaTypeProfile.*; |
31 | 31 |
32 /** | 32 /** |
33 * Utility for deriving hint types for a type check instruction (e.g. checkcast or instanceof) | 33 * Utility for deriving hint types for a type check instruction (e.g. checkcast or instanceof) |
34 * based on the target type of the check and any profiling information available for the instruction. | 34 * based on the target type of the check and any profiling information available for the instruction. |
35 */ | 35 */ |
36 public class TypeCheckHints { | 36 public class TypeCheckHints { |
37 | 37 |
38 private static final RiResolvedType[] NO_TYPES = {}; | 38 private static final ResolvedJavaType[] NO_TYPES = {}; |
39 | 39 |
40 /** | 40 /** |
41 * If true, then {@link #types} contains the only possible type that could pass the type check | 41 * If true, then {@link #types} contains the only possible type that could pass the type check |
42 * because the target of the type check is a final class or has been speculated to be a final class. | 42 * because the target of the type check is a final class or has been speculated to be a final class. |
43 */ | 43 */ |
44 public final boolean exact; | 44 public final boolean exact; |
45 | 45 |
46 /** | 46 /** |
47 * The most likely types that the type check instruction will see. | 47 * The most likely types that the type check instruction will see. |
48 */ | 48 */ |
49 public final RiResolvedType[] types; | 49 public final ResolvedJavaType[] types; |
50 | 50 |
51 /** | 51 /** |
52 * Derives hint information for use when generating the code for a type check instruction. | 52 * Derives hint information for use when generating the code for a type check instruction. |
53 * | 53 * |
54 * @param type the target type of the type check | 54 * @param type the target type of the type check |
56 * @param assumptions the object in which speculations are recorded. This is null if speculations are not supported. | 56 * @param assumptions the object in which speculations are recorded. This is null if speculations are not supported. |
57 * @param minHintHitProbability if the probability that the type check will hit one the profiled types (up to | 57 * @param minHintHitProbability if the probability that the type check will hit one the profiled types (up to |
58 * {@code maxHints}) is below this value, then {@link #types} will be null | 58 * {@code maxHints}) is below this value, then {@link #types} will be null |
59 * @param maxHints the maximum length of {@link #types} | 59 * @param maxHints the maximum length of {@link #types} |
60 */ | 60 */ |
61 public TypeCheckHints(RiResolvedType type, RiTypeProfile profile, CiAssumptions assumptions, double minHintHitProbability, int maxHints) { | 61 public TypeCheckHints(ResolvedJavaType type, JavaTypeProfile profile, CiAssumptions assumptions, double minHintHitProbability, int maxHints) { |
62 if (type != null && isFinalClass(type)) { | 62 if (type != null && isFinalClass(type)) { |
63 types = new RiResolvedType[] {type}; | 63 types = new ResolvedJavaType[] {type}; |
64 exact = true; | 64 exact = true; |
65 } else { | 65 } else { |
66 RiResolvedType uniqueSubtype = type == null ? null : type.uniqueConcreteSubtype(); | 66 ResolvedJavaType uniqueSubtype = type == null ? null : type.uniqueConcreteSubtype(); |
67 if (uniqueSubtype != null) { | 67 if (uniqueSubtype != null) { |
68 types = new RiResolvedType[] {uniqueSubtype}; | 68 types = new ResolvedJavaType[] {uniqueSubtype}; |
69 if (assumptions != null) { | 69 if (assumptions != null) { |
70 assumptions.recordConcreteSubtype(type, uniqueSubtype); | 70 assumptions.recordConcreteSubtype(type, uniqueSubtype); |
71 exact = true; | 71 exact = true; |
72 } else { | 72 } else { |
73 exact = false; | 73 exact = false; |
74 } | 74 } |
75 } else { | 75 } else { |
76 exact = false; | 76 exact = false; |
77 RiResolvedType[] hintTypes = NO_TYPES; | 77 ResolvedJavaType[] hintTypes = NO_TYPES; |
78 RiTypeProfile typeProfile = profile; | 78 JavaTypeProfile typeProfile = profile; |
79 if (typeProfile != null) { | 79 if (typeProfile != null) { |
80 double notRecordedTypes = typeProfile.getNotRecordedProbability(); | 80 double notRecordedTypes = typeProfile.getNotRecordedProbability(); |
81 ProfiledType[] ptypes = typeProfile.getTypes(); | 81 ProfiledType[] ptypes = typeProfile.getTypes(); |
82 if (notRecordedTypes < (1D - minHintHitProbability) && ptypes != null && ptypes.length > 0) { | 82 if (notRecordedTypes < (1D - minHintHitProbability) && ptypes != null && ptypes.length > 0) { |
83 hintTypes = new RiResolvedType[ptypes.length]; | 83 hintTypes = new ResolvedJavaType[ptypes.length]; |
84 int hintCount = 0; | 84 int hintCount = 0; |
85 double totalHintProbability = 0.0d; | 85 double totalHintProbability = 0.0d; |
86 for (ProfiledType ptype : ptypes) { | 86 for (ProfiledType ptype : ptypes) { |
87 RiResolvedType hint = ptype.type; | 87 ResolvedJavaType hint = ptype.type; |
88 if (type != null && hint.isSubtypeOf(type)) { | 88 if (type != null && hint.isSubtypeOf(type)) { |
89 hintTypes[hintCount++] = hint; | 89 hintTypes[hintCount++] = hint; |
90 totalHintProbability += ptype.probability; | 90 totalHintProbability += ptype.probability; |
91 } | 91 } |
92 } | 92 } |
103 this.types = hintTypes; | 103 this.types = hintTypes; |
104 } | 104 } |
105 } | 105 } |
106 } | 106 } |
107 | 107 |
108 public static boolean isFinalClass(RiResolvedType type) { | 108 public static boolean isFinalClass(ResolvedJavaType type) { |
109 return Modifier.isFinal(type.accessFlags()) || (type.isArrayClass() && Modifier.isFinal(type.componentType().accessFlags())); | 109 return Modifier.isFinal(type.accessFlags()) || (type.isArrayClass() && Modifier.isFinal(type.componentType().accessFlags())); |
110 } | 110 } |
111 } | 111 } |