29 import static org.graalvm.compiler.replacements.SnippetTemplate.DEFAULT_REPLACER;
30
31 import org.graalvm.compiler.api.replacements.Snippet;
32 import org.graalvm.compiler.api.replacements.Snippet.ConstantParameter;
33 import org.graalvm.compiler.core.common.spi.ForeignCallDescriptor;
34 import org.graalvm.compiler.debug.GraalError;
35 import org.graalvm.compiler.graph.Node.ConstantNodeParameter;
36 import org.graalvm.compiler.graph.Node.NodeIntrinsic;
37 import org.graalvm.compiler.hotspot.HotSpotBackend;
38 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
39 import org.graalvm.compiler.hotspot.nodes.aot.LoadMethodCountersNode;
40 import org.graalvm.compiler.hotspot.nodes.profiling.ProfileBranchNode;
41 import org.graalvm.compiler.hotspot.nodes.profiling.ProfileInvokeNode;
42 import org.graalvm.compiler.hotspot.nodes.profiling.ProfileNode;
43 import org.graalvm.compiler.hotspot.word.MethodCountersPointer;
44 import org.graalvm.compiler.nodes.ConstantNode;
45 import org.graalvm.compiler.nodes.StructuredGraph;
46 import org.graalvm.compiler.nodes.extended.ForeignCallNode;
47 import org.graalvm.compiler.nodes.spi.LoweringTool;
48 import org.graalvm.compiler.nodes.util.GraphUtil;
49 import org.graalvm.compiler.replacements.SnippetTemplate;
50 import org.graalvm.compiler.replacements.SnippetTemplate.AbstractTemplates;
51 import org.graalvm.compiler.replacements.SnippetTemplate.Arguments;
52 import org.graalvm.compiler.replacements.SnippetTemplate.SnippetInfo;
53 import org.graalvm.compiler.replacements.Snippets;
54
55 import jdk.vm.ci.code.TargetDescription;
56
57 public class ProbabilisticProfileSnippets implements Snippets {
58 @Snippet
59 public static boolean shouldProfile(@ConstantParameter int probLog, int random) {
60 int probabilityMask = (1 << probLog) - 1;
61 return (random & probabilityMask) == 0;
62 }
63
64 @Snippet
65 public static int notificationMask(int freqLog, int probLog) {
66 int probabilityMask = (1 << probLog) - 1;
67 int frequencyMask = (1 << freqLog) - 1;
68 return frequencyMask & ~probabilityMask;
96 int mask = notificationMask(freqLog, probLog);
97 if (probability(SLOW_PATH_PROBABILITY, (counterValue & (mask << config(INJECTED_VMCONFIG).invocationCounterShift)) == 0)) {
98 methodBackedgeEvent(HotSpotBackend.BACKEDGE_EVENT, counters, bci, targetBci);
99 }
100 }
101 }
102
103 @Snippet
104 public static void profileConditionalBackedgeWithProbability(MethodCountersPointer counters, int random, @ConstantParameter int freqLog, @ConstantParameter int probLog, boolean branchCondition,
105 int bci, int targetBci) {
106 if (branchCondition) {
107 profileBackedgeWithProbability(counters, random, freqLog, probLog, bci, targetBci);
108 }
109 }
110
111 public static class Templates extends AbstractTemplates {
112 private final SnippetInfo profileMethodEntryWithProbability = snippet(ProbabilisticProfileSnippets.class, "profileMethodEntryWithProbability");
113 private final SnippetInfo profileBackedgeWithProbability = snippet(ProbabilisticProfileSnippets.class, "profileBackedgeWithProbability");
114 private final SnippetInfo profileConditionalBackedgeWithProbability = snippet(ProbabilisticProfileSnippets.class, "profileConditionalBackedgeWithProbability");
115
116 public Templates(HotSpotProviders providers, TargetDescription target) {
117 super(providers, providers.getSnippetReflection(), target);
118 }
119
120 public void lower(ProfileNode profileNode, LoweringTool tool) {
121 assert profileNode.getRandom() != null;
122
123 StructuredGraph graph = profileNode.graph();
124 LoadMethodCountersNode counters = graph.unique(new LoadMethodCountersNode(profileNode.getProfiledMethod()));
125
126 if (profileNode instanceof ProfileBranchNode) {
127 // Backedge event
128 ProfileBranchNode profileBranchNode = (ProfileBranchNode) profileNode;
129 SnippetInfo snippet = profileBranchNode.hasCondition() ? profileConditionalBackedgeWithProbability : profileBackedgeWithProbability;
130 Arguments args = new Arguments(snippet, graph.getGuardsStage(), tool.getLoweringStage());
131 ConstantNode bci = ConstantNode.forInt(profileBranchNode.bci(), graph);
132 ConstantNode targetBci = ConstantNode.forInt(profileBranchNode.targetBci(), graph);
133 args.add("counters", counters);
134 args.add("random", profileBranchNode.getRandom());
135 args.addConst("freqLog", profileBranchNode.getNotificationFreqLog());
136 args.addConst("probLog", profileBranchNode.getProbabilityLog());
137 if (profileBranchNode.hasCondition()) {
|
29 import static org.graalvm.compiler.replacements.SnippetTemplate.DEFAULT_REPLACER;
30
31 import org.graalvm.compiler.api.replacements.Snippet;
32 import org.graalvm.compiler.api.replacements.Snippet.ConstantParameter;
33 import org.graalvm.compiler.core.common.spi.ForeignCallDescriptor;
34 import org.graalvm.compiler.debug.GraalError;
35 import org.graalvm.compiler.graph.Node.ConstantNodeParameter;
36 import org.graalvm.compiler.graph.Node.NodeIntrinsic;
37 import org.graalvm.compiler.hotspot.HotSpotBackend;
38 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
39 import org.graalvm.compiler.hotspot.nodes.aot.LoadMethodCountersNode;
40 import org.graalvm.compiler.hotspot.nodes.profiling.ProfileBranchNode;
41 import org.graalvm.compiler.hotspot.nodes.profiling.ProfileInvokeNode;
42 import org.graalvm.compiler.hotspot.nodes.profiling.ProfileNode;
43 import org.graalvm.compiler.hotspot.word.MethodCountersPointer;
44 import org.graalvm.compiler.nodes.ConstantNode;
45 import org.graalvm.compiler.nodes.StructuredGraph;
46 import org.graalvm.compiler.nodes.extended.ForeignCallNode;
47 import org.graalvm.compiler.nodes.spi.LoweringTool;
48 import org.graalvm.compiler.nodes.util.GraphUtil;
49 import org.graalvm.compiler.options.OptionValues;
50 import org.graalvm.compiler.replacements.SnippetTemplate;
51 import org.graalvm.compiler.replacements.SnippetTemplate.AbstractTemplates;
52 import org.graalvm.compiler.replacements.SnippetTemplate.Arguments;
53 import org.graalvm.compiler.replacements.SnippetTemplate.SnippetInfo;
54 import org.graalvm.compiler.replacements.Snippets;
55
56 import jdk.vm.ci.code.TargetDescription;
57
58 public class ProbabilisticProfileSnippets implements Snippets {
59 @Snippet
60 public static boolean shouldProfile(@ConstantParameter int probLog, int random) {
61 int probabilityMask = (1 << probLog) - 1;
62 return (random & probabilityMask) == 0;
63 }
64
65 @Snippet
66 public static int notificationMask(int freqLog, int probLog) {
67 int probabilityMask = (1 << probLog) - 1;
68 int frequencyMask = (1 << freqLog) - 1;
69 return frequencyMask & ~probabilityMask;
97 int mask = notificationMask(freqLog, probLog);
98 if (probability(SLOW_PATH_PROBABILITY, (counterValue & (mask << config(INJECTED_VMCONFIG).invocationCounterShift)) == 0)) {
99 methodBackedgeEvent(HotSpotBackend.BACKEDGE_EVENT, counters, bci, targetBci);
100 }
101 }
102 }
103
104 @Snippet
105 public static void profileConditionalBackedgeWithProbability(MethodCountersPointer counters, int random, @ConstantParameter int freqLog, @ConstantParameter int probLog, boolean branchCondition,
106 int bci, int targetBci) {
107 if (branchCondition) {
108 profileBackedgeWithProbability(counters, random, freqLog, probLog, bci, targetBci);
109 }
110 }
111
112 public static class Templates extends AbstractTemplates {
113 private final SnippetInfo profileMethodEntryWithProbability = snippet(ProbabilisticProfileSnippets.class, "profileMethodEntryWithProbability");
114 private final SnippetInfo profileBackedgeWithProbability = snippet(ProbabilisticProfileSnippets.class, "profileBackedgeWithProbability");
115 private final SnippetInfo profileConditionalBackedgeWithProbability = snippet(ProbabilisticProfileSnippets.class, "profileConditionalBackedgeWithProbability");
116
117 public Templates(OptionValues options, HotSpotProviders providers, TargetDescription target) {
118 super(options, providers, providers.getSnippetReflection(), target);
119 }
120
121 public void lower(ProfileNode profileNode, LoweringTool tool) {
122 assert profileNode.getRandom() != null;
123
124 StructuredGraph graph = profileNode.graph();
125 LoadMethodCountersNode counters = graph.unique(new LoadMethodCountersNode(profileNode.getProfiledMethod()));
126
127 if (profileNode instanceof ProfileBranchNode) {
128 // Backedge event
129 ProfileBranchNode profileBranchNode = (ProfileBranchNode) profileNode;
130 SnippetInfo snippet = profileBranchNode.hasCondition() ? profileConditionalBackedgeWithProbability : profileBackedgeWithProbability;
131 Arguments args = new Arguments(snippet, graph.getGuardsStage(), tool.getLoweringStage());
132 ConstantNode bci = ConstantNode.forInt(profileBranchNode.bci(), graph);
133 ConstantNode targetBci = ConstantNode.forInt(profileBranchNode.targetBci(), graph);
134 args.add("counters", counters);
135 args.add("random", profileBranchNode.getRandom());
136 args.addConst("freqLog", profileBranchNode.getNotificationFreqLog());
137 args.addConst("probLog", profileBranchNode.getProbabilityLog());
138 if (profileBranchNode.hasCondition()) {
|