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 */
013package org.jikesrvm.adaptive.controller;
014
015import org.jikesrvm.adaptive.recompilation.CompilerDNA;
016import org.jikesrvm.classloader.NormalMethod;
017import org.jikesrvm.compilers.common.CompiledMethod;
018
019/**
020 * Represents the recompilation choice of simply recompiling the
021 * method in question at a particular opt-level.  The cost is the
022 * expected compilation time at that level, and the benefit is the
023 * execution improvement of executing at that level.
024 */
025class RecompileOptChoice extends RecompilationChoice {
026
027  /**
028   * The opt level associated with this recompilation choice
029   */
030  private final int thisChoiceOptLevel;
031
032  /**
033   * The "compiler" (see CompilerDNA) that is associated with this choice
034   */
035  private final int thisChoiceCompiler;
036
037  /**
038   * Constructor
039   * @param level the opt level associated with this choice
040   */
041  RecompileOptChoice(int level) {
042    thisChoiceOptLevel = level;
043    thisChoiceCompiler = CompilerDNA.getCompilerConstant(level);
044  }
045
046  @Override
047  double getCost(NormalMethod meth) {
048    return CompilerDNA.estimateCompileTime(getCompiler(), meth);
049  }
050
051  @Override
052  double getFutureExecutionTime(int prevCompiler, double futureTimeForMethod) {
053    double rtFactor = CompilerDNA.getBenefitRatio(prevCompiler, getCompiler());
054    return futureTimeForMethod / rtFactor;
055  }
056
057  /**
058   * {@inheritDoc}
059   * In this case, simply create a plan to recompile at level {@link #thisChoiceOptLevel}.
060   */
061  @Override
062  ControllerPlan makeControllerPlan(CompiledMethod cmpMethod, int prevCompiler, double prevTimeForMethod,
063                                       double bestActionTime, double expectedCompilationTime) {
064    double speedup = CompilerDNA.getBenefitRatio(prevCompiler, getCompiler());
065    double priority = prevTimeForMethod - bestActionTime;
066    return Controller.recompilationStrategy.
067        createControllerPlan(cmpMethod.getMethod(),
068                             thisChoiceOptLevel,
069                             null,
070                             cmpMethod.getId(),
071                             speedup,
072                             expectedCompilationTime,
073                             priority);
074  }
075
076  /**
077   * How should this choice be displayed?
078   */
079  @Override
080  public String toString() {
081    return "O" + getOptLevel();
082  }
083
084  /**
085   * Which opt-level is associated with this choice?
086   * @return the opt-level for this choice
087   */
088  int getOptLevel() {
089    return thisChoiceOptLevel;
090  }
091
092  /**
093   * Which "compiler" is associated with this choice?
094   * @return the integer representing the compiler for this choice
095   * @see CompilerDNA#getCompilerConstant(int)
096   */
097  int getCompiler() {
098    return thisChoiceCompiler;
099  }
100}