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.compilers.opt.driver;
014
015 import org.jikesrvm.VM;
016 import org.jikesrvm.compilers.opt.OptOptions;
017 import org.jikesrvm.compilers.opt.ir.IR;
018
019 /**
020 * An element in the opt compiler's optimization plan.
021 *
022 * NOTE: Instances of subclasses of this class are
023 * held in OptimizationPlanner.masterPlan
024 * and thus represent global state.
025 * It is therefore incorrect for any per-compilation
026 * state to be stored in an instance field of
027 * one of these objects.
028 *
029 * TODO: refactor the optimization plan elements and compiler phases
030 */
031 public abstract class OptimizationPlanElement {
032
033 /**
034 * Determine, possibly by consulting the passed options object,
035 * if this optimization plan element should be performed.
036 *
037 * @param options The Options object for the current compilation.
038 * @return true if the plan element should be performed.
039 */
040 public abstract boolean shouldPerform(OptOptions options);
041
042 /**
043 * Do the work represented by this element in the optimization plan.
044 * The assumption is that the work will modify the IR in some way.
045 *
046 * @param ir The IR object to work with.
047 */
048 public abstract void perform(IR ir);
049
050 /**
051 * @return a String which is the name of the phase.
052 */
053 public abstract String getName();
054
055 /**
056 * This method is called to initialize the optimization plan support
057 * measuring compilation.
058 */
059 public abstract void initializeForMeasureCompilation();
060
061 /**
062 * Generate (to the sysWrite stream) a report of the
063 * time spent performing this element of the optimization plan.
064 *
065 * @param indent Number of spaces to indent report.
066 * @param timeCol Column number of time portion of report.
067 * @param totalTime Total opt compilation time in seconds.
068 */
069 public abstract void reportStats(int indent, int timeCol, double totalTime);
070
071 /**
072 * Report the elapsed time spent in the PlanElement
073 * @return time spend in the plan (in ms)
074 */
075 public abstract double elapsedTime();
076
077 /**
078 * Helper function for <code> reportStats </code>
079 */
080 protected void prettyPrintTime(double time, double totalTime) {
081 int t = (int) time;
082 if (t < 1000000) {
083 VM.sysWrite(" ");
084 }
085 if (t < 100000) {
086 VM.sysWrite(" ");
087 }
088 if (t < 10000) {
089 VM.sysWrite(" ");
090 }
091 if (t < 1000) {
092 VM.sysWrite(" ");
093 }
094 if (t < 100) {
095 VM.sysWrite(" ");
096 }
097 if (t < 10) {
098 VM.sysWrite(" ");
099 }
100 VM.sysWrite(t);
101 if (time / totalTime > 0.10) {
102 VM.sysWrite(" ");
103 } else {
104 VM.sysWrite(" ");
105 }
106 VM.sysWrite(time / totalTime * 100, 2);
107 VM.sysWrite("%");
108 }
109 }