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.ssa;
014    
015    import java.lang.reflect.Constructor;
016    
017    import org.jikesrvm.compilers.opt.DefUse;
018    import org.jikesrvm.compilers.opt.ExpressionFolding;
019    import org.jikesrvm.compilers.opt.OptOptions;
020    import org.jikesrvm.compilers.opt.Simple;
021    import org.jikesrvm.compilers.opt.controlflow.DominanceFrontier;
022    import org.jikesrvm.compilers.opt.controlflow.DominatorsPhase;
023    import org.jikesrvm.compilers.opt.driver.CompilerPhase;
024    import org.jikesrvm.compilers.opt.driver.OptimizationPlanAtomicElement;
025    import org.jikesrvm.compilers.opt.driver.OptimizationPlanCompositeElement;
026    import org.jikesrvm.compilers.opt.driver.OptimizationPlanElement;
027    import org.jikesrvm.compilers.opt.ir.IR;
028    
029    /**
030     * This phase puts the IR in SSA form and performs a set of simple
031     * optimizations to clean up.
032     */
033    public final class SSATuneUp extends OptimizationPlanCompositeElement {
034    
035      /**
036       * Build this phase as a composite of others.
037       */
038      public SSATuneUp() {
039        super("SSA Tune Up", new OptimizationPlanElement[]{
040            // 1. Set up IR state to control SSA translation as needed
041            new OptimizationPlanAtomicElement(new TuneUpPreparation()),
042            // 2. Get the desired SSA form
043            new OptimizationPlanAtomicElement(new EnterSSA()),
044            // 3. Perform simple optimizations
045            new OptimizationPlanAtomicElement(new Simple(1, true, true, false, false)),
046            // 4. Perform expression simplification
047            new OptimizationPlanAtomicElement(new FoldingDriver())});
048      }
049    
050      @Override
051      public boolean shouldPerform(OptOptions options) {
052        return options.SSA;
053      }
054    
055      /**
056       * This class drives expression folding.
057       */
058      private static class FoldingDriver extends CompilerPhase {
059    
060        /**
061         * Return this instance of this phase. This phase contains no
062         * per-compilation instance fields.
063         * @param ir not used
064         * @return this
065         */
066        @Override
067        public CompilerPhase newExecution(IR ir) {
068          return this;
069        }
070    
071        @Override
072        public final boolean shouldPerform(OptOptions options) {
073          return options.SSA && options.SSA_EXPRESSION_FOLDING;
074        }
075    
076        @Override
077        public final String getName() {
078          return "SSA Expression Folding";
079        }
080    
081        /**
082         * Execute expression folding.
083         */
084        @Override
085        public final void perform(IR ir) {
086          DefUse.computeDU(ir);
087          ExpressionFolding.perform(ir);
088        }
089      }
090    
091      /**
092       * This class sets up the IR state prior to entering SSA.
093       */
094      public static class TuneUpPreparation extends CompilerPhase {
095    
096        /**
097         * Compiler phases necessary to re-build dominators and dominance
098         * frontier
099         */
100        private final CompilerPhase dominators, frontier;
101    
102        public TuneUpPreparation() {
103          dominators = new DominatorsPhase(true);
104          frontier = new DominanceFrontier();
105        }
106    
107        /**
108         * Constructor for this compiler phase
109         */
110        private static final Constructor<CompilerPhase> constructor =
111            getCompilerPhaseConstructor(TuneUpPreparation.class);
112    
113        /**
114         * Get a constructor object for this compiler phase
115         * @return compiler phase constructor
116         */
117        @Override
118        public Constructor<CompilerPhase> getClassConstructor() {
119          return constructor;
120        }
121    
122        @Override
123        public final boolean shouldPerform(OptOptions options) {
124          return options.SSA;
125        }
126    
127        @Override
128        public final String getName() {
129          return "SSA Tune UpPreparation";
130        }
131    
132        /**
133         * register in the IR the SSA properties we need for simple scalar
134         * optimizations
135         */
136        @Override
137        public final void perform(IR ir) {
138          ir.desiredSSAOptions = new SSAOptions();
139          ir.desiredSSAOptions.setScalarsOnly(true);
140          ir.desiredSSAOptions.setBackwards(false);
141          ir.desiredSSAOptions.setInsertUsePhis(false);
142          if (!ir.HIRInfo.dominatorsAreComputed) {
143            dominators.perform(ir);
144            frontier.perform(ir);
145          }
146        }
147      }
148    }