/*
* This file is part of the Jikes RVM project (http://jikesrvm.org).
*
* This file is licensed to You under the Common Public License (CPL);
* You may not use this file except in compliance with the License. You
* may obtain a copy of the License at
*
* http://www.opensource.org/licenses/cpl1.0.php
*
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership.
*/
package org.jikesrvm.adaptive.controller;
import org.jikesrvm.adaptive.database.callgraph.VM_PartialCallGraph;
import org.jikesrvm.adaptive.measurements.VM_RuntimeMeasurements;
import org.jikesrvm.adaptive.measurements.listeners.VM_CallDensityListener;
import org.jikesrvm.adaptive.util.VM_AOSOptions;
/**
* Collection of static methods to assist with adaptive inlining.
*/
public class VM_AdaptiveInlining {
/**
* A listener that tracks and can report the call density
* of the program (fraction of yieldpoints that are taken
* at prologue/epilogues).
*/
private static final VM_CallDensityListener callDensityListener = new VM_CallDensityListener();
/**
* Set parameters.
* Must be called after parsing command-line.
*/
static void boot(VM_AOSOptions options) {
// create and register the dcg as a decayable object
// Give it an initial seed weight that approximates the old step
// function for edge hotness. The intent is that early on
// (until decay decreases this initial weight), we are conservative in
// marking an edge as hot.
VM_Controller.dcg = new VM_PartialCallGraph(options.AI_SEED_MULTIPLIER * (1 / options.AI_HOT_CALLSITE_THRESHOLD));
VM_RuntimeMeasurements.registerDecayableObject(VM_Controller.dcg);
// Track call density: fraction of timer interrupts taken in prologue/epilogue
VM_RuntimeMeasurements.installTimerNullListener(callDensityListener);
callDensityListener.activate();
if (options.GATHER_PROFILE_DATA) {
VM_RuntimeMeasurements.registerReportableObject(VM_Controller.dcg);
}
}
public static double adjustedWeight(double weight) {
return weight / (VM_Controller.dcg.getTotalEdgeWeights()) * callDensityListener.callDensity();
}
}