27 import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC;
28 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.PRIMARY_SUPERS_LOCATION;
29 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.SECONDARY_SUPER_CACHE_LOCATION;
30 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.loadHubIntrinsic;
31 import static org.graalvm.compiler.hotspot.replacements.HotspotSnippetsOptions.TypeCheckMaxHints;
32 import static org.graalvm.compiler.hotspot.replacements.HotspotSnippetsOptions.TypeCheckMinProfileHitProbability;
33 import static org.graalvm.compiler.hotspot.replacements.TypeCheckSnippetUtils.checkSecondarySubType;
34 import static org.graalvm.compiler.hotspot.replacements.TypeCheckSnippetUtils.checkUnknownSubType;
35 import static org.graalvm.compiler.hotspot.replacements.TypeCheckSnippetUtils.createHints;
36 import static org.graalvm.compiler.nodes.extended.BranchProbabilityNode.LIKELY_PROBABILITY;
37 import static org.graalvm.compiler.nodes.extended.BranchProbabilityNode.NOT_FREQUENT_PROBABILITY;
38 import static org.graalvm.compiler.nodes.extended.BranchProbabilityNode.NOT_LIKELY_PROBABILITY;
39 import static org.graalvm.compiler.nodes.extended.BranchProbabilityNode.probability;
40
41 import org.graalvm.compiler.api.replacements.Snippet;
42 import org.graalvm.compiler.api.replacements.Snippet.ConstantParameter;
43 import org.graalvm.compiler.api.replacements.Snippet.NonNullParameter;
44 import org.graalvm.compiler.api.replacements.Snippet.VarargsParameter;
45 import org.graalvm.compiler.core.common.type.ObjectStamp;
46 import org.graalvm.compiler.core.common.type.StampFactory;
47 import org.graalvm.compiler.debug.GraalError;
48 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
49 import org.graalvm.compiler.hotspot.nodes.type.KlassPointerStamp;
50 import org.graalvm.compiler.hotspot.replacements.TypeCheckSnippetUtils.Counters;
51 import org.graalvm.compiler.hotspot.replacements.TypeCheckSnippetUtils.Hints;
52 import org.graalvm.compiler.hotspot.word.KlassPointer;
53 import org.graalvm.compiler.nodes.ConstantNode;
54 import org.graalvm.compiler.nodes.DeoptimizeNode;
55 import org.graalvm.compiler.nodes.PiNode;
56 import org.graalvm.compiler.nodes.SnippetAnchorNode;
57 import org.graalvm.compiler.nodes.StructuredGraph;
58 import org.graalvm.compiler.nodes.TypeCheckHints;
59 import org.graalvm.compiler.nodes.ValueNode;
60 import org.graalvm.compiler.nodes.extended.BranchProbabilityNode;
61 import org.graalvm.compiler.nodes.extended.GuardingNode;
62 import org.graalvm.compiler.nodes.java.ClassIsAssignableFromNode;
63 import org.graalvm.compiler.nodes.java.InstanceOfDynamicNode;
64 import org.graalvm.compiler.nodes.java.InstanceOfNode;
65 import org.graalvm.compiler.nodes.spi.LoweringTool;
66 import org.graalvm.compiler.options.OptionValues;
242 }
243 }
244 }
245
246 // If either hub is null, one of them is a primitive type and given that the class is not
247 // equal, return false.
248 return falseValue;
249 }
250
251 public static class Templates extends InstanceOfSnippetsTemplates {
252
253 private final SnippetInfo instanceofWithProfile = snippet(InstanceOfSnippets.class, "instanceofWithProfile");
254 private final SnippetInfo instanceofExact = snippet(InstanceOfSnippets.class, "instanceofExact");
255 private final SnippetInfo instanceofPrimary = snippet(InstanceOfSnippets.class, "instanceofPrimary");
256 private final SnippetInfo instanceofSecondary = snippet(InstanceOfSnippets.class, "instanceofSecondary", SECONDARY_SUPER_CACHE_LOCATION);
257 private final SnippetInfo instanceofDynamic = snippet(InstanceOfSnippets.class, "instanceofDynamic", SECONDARY_SUPER_CACHE_LOCATION);
258 private final SnippetInfo isAssignableFrom = snippet(InstanceOfSnippets.class, "isAssignableFrom", SECONDARY_SUPER_CACHE_LOCATION);
259
260 private final Counters counters;
261
262 public Templates(OptionValues options, SnippetCounter.Group.Factory factory, HotSpotProviders providers, TargetDescription target) {
263 super(options, providers, providers.getSnippetReflection(), target);
264 this.counters = new Counters(factory);
265 }
266
267 @Override
268 protected Arguments makeArguments(InstanceOfUsageReplacer replacer, LoweringTool tool) {
269 if (replacer.instanceOf instanceof InstanceOfNode) {
270 InstanceOfNode instanceOf = (InstanceOfNode) replacer.instanceOf;
271 ValueNode object = instanceOf.getValue();
272 Assumptions assumptions = instanceOf.graph().getAssumptions();
273
274 OptionValues localOptions = instanceOf.getOptions();
275 JavaTypeProfile profile = instanceOf.profile();
276 if (GeneratePIC.getValue(localOptions)) {
277 // FIXME: We can't embed constants in hints. We can't really load them from GOT
278 // either. Hard problem.
279 profile = null;
280 }
281 TypeCheckHints hintInfo = new TypeCheckHints(instanceOf.type(), profile, assumptions, TypeCheckMinProfileHitProbability.getValue(localOptions),
282 TypeCheckMaxHints.getValue(localOptions));
283 final HotSpotResolvedObjectType type = (HotSpotResolvedObjectType) instanceOf.type().getType();
|
27 import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC;
28 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.PRIMARY_SUPERS_LOCATION;
29 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.SECONDARY_SUPER_CACHE_LOCATION;
30 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.loadHubIntrinsic;
31 import static org.graalvm.compiler.hotspot.replacements.HotspotSnippetsOptions.TypeCheckMaxHints;
32 import static org.graalvm.compiler.hotspot.replacements.HotspotSnippetsOptions.TypeCheckMinProfileHitProbability;
33 import static org.graalvm.compiler.hotspot.replacements.TypeCheckSnippetUtils.checkSecondarySubType;
34 import static org.graalvm.compiler.hotspot.replacements.TypeCheckSnippetUtils.checkUnknownSubType;
35 import static org.graalvm.compiler.hotspot.replacements.TypeCheckSnippetUtils.createHints;
36 import static org.graalvm.compiler.nodes.extended.BranchProbabilityNode.LIKELY_PROBABILITY;
37 import static org.graalvm.compiler.nodes.extended.BranchProbabilityNode.NOT_FREQUENT_PROBABILITY;
38 import static org.graalvm.compiler.nodes.extended.BranchProbabilityNode.NOT_LIKELY_PROBABILITY;
39 import static org.graalvm.compiler.nodes.extended.BranchProbabilityNode.probability;
40
41 import org.graalvm.compiler.api.replacements.Snippet;
42 import org.graalvm.compiler.api.replacements.Snippet.ConstantParameter;
43 import org.graalvm.compiler.api.replacements.Snippet.NonNullParameter;
44 import org.graalvm.compiler.api.replacements.Snippet.VarargsParameter;
45 import org.graalvm.compiler.core.common.type.ObjectStamp;
46 import org.graalvm.compiler.core.common.type.StampFactory;
47 import org.graalvm.compiler.debug.DebugHandlersFactory;
48 import org.graalvm.compiler.debug.GraalError;
49 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
50 import org.graalvm.compiler.hotspot.nodes.type.KlassPointerStamp;
51 import org.graalvm.compiler.hotspot.replacements.TypeCheckSnippetUtils.Counters;
52 import org.graalvm.compiler.hotspot.replacements.TypeCheckSnippetUtils.Hints;
53 import org.graalvm.compiler.hotspot.word.KlassPointer;
54 import org.graalvm.compiler.nodes.ConstantNode;
55 import org.graalvm.compiler.nodes.DeoptimizeNode;
56 import org.graalvm.compiler.nodes.PiNode;
57 import org.graalvm.compiler.nodes.SnippetAnchorNode;
58 import org.graalvm.compiler.nodes.StructuredGraph;
59 import org.graalvm.compiler.nodes.TypeCheckHints;
60 import org.graalvm.compiler.nodes.ValueNode;
61 import org.graalvm.compiler.nodes.extended.BranchProbabilityNode;
62 import org.graalvm.compiler.nodes.extended.GuardingNode;
63 import org.graalvm.compiler.nodes.java.ClassIsAssignableFromNode;
64 import org.graalvm.compiler.nodes.java.InstanceOfDynamicNode;
65 import org.graalvm.compiler.nodes.java.InstanceOfNode;
66 import org.graalvm.compiler.nodes.spi.LoweringTool;
67 import org.graalvm.compiler.options.OptionValues;
243 }
244 }
245 }
246
247 // If either hub is null, one of them is a primitive type and given that the class is not
248 // equal, return false.
249 return falseValue;
250 }
251
252 public static class Templates extends InstanceOfSnippetsTemplates {
253
254 private final SnippetInfo instanceofWithProfile = snippet(InstanceOfSnippets.class, "instanceofWithProfile");
255 private final SnippetInfo instanceofExact = snippet(InstanceOfSnippets.class, "instanceofExact");
256 private final SnippetInfo instanceofPrimary = snippet(InstanceOfSnippets.class, "instanceofPrimary");
257 private final SnippetInfo instanceofSecondary = snippet(InstanceOfSnippets.class, "instanceofSecondary", SECONDARY_SUPER_CACHE_LOCATION);
258 private final SnippetInfo instanceofDynamic = snippet(InstanceOfSnippets.class, "instanceofDynamic", SECONDARY_SUPER_CACHE_LOCATION);
259 private final SnippetInfo isAssignableFrom = snippet(InstanceOfSnippets.class, "isAssignableFrom", SECONDARY_SUPER_CACHE_LOCATION);
260
261 private final Counters counters;
262
263 public Templates(OptionValues options, Iterable<DebugHandlersFactory> factories, SnippetCounter.Group.Factory factory, HotSpotProviders providers, TargetDescription target) {
264 super(options, factories, providers, providers.getSnippetReflection(), target);
265 this.counters = new Counters(factory);
266 }
267
268 @Override
269 protected Arguments makeArguments(InstanceOfUsageReplacer replacer, LoweringTool tool) {
270 if (replacer.instanceOf instanceof InstanceOfNode) {
271 InstanceOfNode instanceOf = (InstanceOfNode) replacer.instanceOf;
272 ValueNode object = instanceOf.getValue();
273 Assumptions assumptions = instanceOf.graph().getAssumptions();
274
275 OptionValues localOptions = instanceOf.getOptions();
276 JavaTypeProfile profile = instanceOf.profile();
277 if (GeneratePIC.getValue(localOptions)) {
278 // FIXME: We can't embed constants in hints. We can't really load them from GOT
279 // either. Hard problem.
280 profile = null;
281 }
282 TypeCheckHints hintInfo = new TypeCheckHints(instanceOf.type(), profile, assumptions, TypeCheckMinProfileHitProbability.getValue(localOptions),
283 TypeCheckMaxHints.getValue(localOptions));
284 final HotSpotResolvedObjectType type = (HotSpotResolvedObjectType) instanceOf.type().getType();
|