< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/DynamicCounterNode.java

Print this page
rev 52509 : [mq]: graal2

*** 66,81 **** --- 66,104 ---- public DynamicCounterNode(String group, String name, ValueNode increment, boolean withContext) { this(TYPE, group, name, increment, withContext); } + public static final long MIN_INCREMENT = 0; + public static final long MAX_INCREMENT = 10_000; + + /** + * Clamps {@code value} to a value between {@link #MIN_INCREMENT} and {@link #MAX_INCREMENT}. + * This mitigates the possibility of overflowing benchmark counters. + */ + public static long clampIncrement(long value) { + return Math.min(Math.max(value, MIN_INCREMENT), MAX_INCREMENT); + } + + private boolean checkIncrement() { + if (increment.isJavaConstant()) { + long incValue = increment.asJavaConstant().asLong(); + if (incValue < MIN_INCREMENT || incValue > MAX_INCREMENT) { + String message = String.format("Benchmark counter %s:%s has increment out of range [%d .. %d]: %d", group, getNameWithContext(), MIN_INCREMENT, MAX_INCREMENT, incValue); + assert false : message; + } + } + return true; + } + protected DynamicCounterNode(NodeClass<? extends DynamicCounterNode> c, String group, String name, ValueNode increment, boolean withContext) { super(c, StampFactory.forVoid()); this.group = group; this.name = name; this.increment = increment; this.withContext = withContext; + assert checkIncrement(); } public ValueNode getIncrement() { return increment; }
*** 101,110 **** --- 124,143 ---- public static native void counter(@ConstantNodeParameter String group, @ConstantNodeParameter String name, long increment, @ConstantNodeParameter boolean addContext); @Override public void generate(NodeLIRBuilderTool generator) { LIRGeneratorTool lirGen = generator.getLIRGeneratorTool(); + String nameWithContext = getNameWithContext(); + LIRInstruction counterOp = lirGen.createBenchmarkCounter(nameWithContext, getGroup(), generator.operand(increment)); + if (counterOp != null) { + lirGen.append(counterOp); + } else { + throw GraalError.unimplemented("Benchmark counters not enabled or not implemented by the back end."); + } + } + + private String getNameWithContext() { String nameWithContext; if (isWithContext()) { nameWithContext = getName() + " @ "; if (graph().method() != null) { StackTraceElement stackTraceElement = graph().method().asStackTraceElement(0);
*** 119,132 **** } } else { nameWithContext = getName(); } ! LIRInstruction counterOp = lirGen.createBenchmarkCounter(nameWithContext, getGroup(), generator.operand(increment)); ! if (counterOp != null) { ! lirGen.append(counterOp); ! } else { ! throw GraalError.unimplemented("Benchmark counters not enabled or not implemented by the back end."); ! } } - } --- 152,159 ---- } } else { nameWithContext = getName(); } ! return nameWithContext; } }
< prev index next >