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.regalloc;
014
015 import org.jikesrvm.compilers.opt.OptOptions;
016 import org.jikesrvm.compilers.opt.driver.CompilerPhase;
017 import org.jikesrvm.compilers.opt.driver.OptimizationPlanAtomicElement;
018 import org.jikesrvm.compilers.opt.driver.OptimizationPlanCompositeElement;
019 import org.jikesrvm.compilers.opt.driver.OptimizationPlanElement;
020 import org.jikesrvm.compilers.opt.ir.IR;
021
022 /**
023 * Driver routine for register allocation
024 */
025 public final class RegisterAllocator extends OptimizationPlanCompositeElement {
026
027 public RegisterAllocator() {
028 super("Register Allocation", new OptimizationPlanElement[]{
029 // 1. Prepare for the allocation
030 new OptimizationPlanAtomicElement(new RegisterAllocPreparation()),
031 // 2. Perform the allocation, using the live information
032 new LinearScan()});
033 }
034
035 @Override
036 public boolean shouldPerform(OptOptions options) { return true; }
037
038 @Override
039 public String getName() { return "RegAlloc"; }
040
041 @Override
042 public boolean printingEnabled(OptOptions options, boolean before) {
043 return options.PRINT_REGALLOC;
044 }
045
046 private static class RegisterAllocPreparation extends CompilerPhase {
047 @Override
048 public final boolean shouldPerform(OptOptions options) {
049 return true;
050 }
051
052 /**
053 * Return this instance of this phase. This phase contains no
054 * per-compilation instance fields.
055 * @param ir not used
056 * @return this
057 */
058 @Override
059 public CompilerPhase newExecution(IR ir) {
060 return this;
061 }
062
063 @Override
064 public final String getName() {
065 return "Register Allocation Preparation";
066 }
067
068 /**
069 * create the stack manager
070 */
071 @Override
072 public final void perform(org.jikesrvm.compilers.opt.ir.IR ir) {
073 ir.stackManager.prepare(ir);
074 }
075 }
076 }