001    /*
002     *  This file is part of the Jikes RVM project (http://jikesrvm.org).
003     *
004     *  This file is licensed to You under the Eclipse Public License (EPL);
005     *  You may not use this file except in compliance with the License. You
006     *  may obtain a copy of the License at
007     *
008     *      http://www.opensource.org/licenses/eclipse-1.0.php
009     *
010     *  See the COPYRIGHT.txt file distributed with this work for information
011     *  regarding copyright ownership.
012     */
013    package org.jikesrvm.adaptive.controller;
014    
015    import org.jikesrvm.adaptive.database.callgraph.PartialCallGraph;
016    import org.jikesrvm.adaptive.measurements.RuntimeMeasurements;
017    import org.jikesrvm.adaptive.measurements.listeners.CallDensityListener;
018    import org.jikesrvm.adaptive.util.AOSOptions;
019    
020    /**
021     * Collection of static methods to assist with adaptive inlining.
022     */
023    public class AdaptiveInlining {
024    
025      /**
026       * A listener that tracks and can report the call density
027       * of the program (fraction of yieldpoints that are taken
028       * at prologue/epilogues).
029       */
030      private static final CallDensityListener callDensityListener = new CallDensityListener();
031    
032      /**
033       * Set parameters.
034       * Must be called after parsing command-line.
035       */
036      static void boot(AOSOptions options) {
037        // create and register the dcg as a decayable object
038        // Give it an initial seed weight that approximates the old step
039        // function for edge hotness.  The intent is that early on
040        // (until decay decreases this initial weight), we are conservative in
041        // marking an edge as hot.
042        Controller.dcg = new PartialCallGraph(options.INLINE_AI_SEED_MULTIPLIER * (1 / options.INLINE_AI_HOT_CALLSITE_THRESHOLD));
043        RuntimeMeasurements.registerDecayableObject(Controller.dcg);
044    
045        // Track call density: fraction of timer interrupts taken in prologue/epilogue
046        RuntimeMeasurements.installTimerNullListener(callDensityListener);
047        callDensityListener.activate();
048    
049        if (options.GATHER_PROFILE_DATA) {
050          RuntimeMeasurements.registerReportableObject(Controller.dcg);
051        }
052      }
053    
054      public static double adjustedWeight(double weight) {
055        return weight / (Controller.dcg.getTotalEdgeWeights()) * callDensityListener.callDensity();
056      }
057    }