1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage com.android.dx.ssa; 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <h1>An introduction to SSA Form</h1> 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * This package contains classes associated with dx's {@code SSA} 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * intermediate form. This form is a static-single-assignment representation of 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Rop-form a method with Rop-form-like instructions (with the addition of a 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@link PhiInsn phi instriction}. This form is intended to make it easy to 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * implement basic optimization steps and register allocation so that a 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * reasonably efficient register machine representation can be produced from a 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * stack machine source bytecode.<p> 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <h2>Key Classes</h2> 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <h3>Classes related to conversion and lifetime</h3> 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <ul> 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li> {@link Optimizer} is a singleton class containing methods for 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * converting, optimizing, and then back-converting Rop-form methods. It's the 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * typical gateway into the rest of the package. 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li> {@link SsaConverter} converts a Rop-form method to SSA form. 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li> {@link SsaToRop} converts an SSA-form method back to Rop form. 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </ul> 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <h3>Classes related to method representation</h3> 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <ul> 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li> A {@link SsaMethod} instance represents a method. 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li> A {@link SsaBasicBlock} instance represents a basic block, whose 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * semantics are quite similar to basic blocks in 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@link com.android.dx.rop Rop form}. 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li> {@link PhiInsn} instances represent "phi" operators defined in SSA 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * literature. They must be the first N instructions in a basic block. 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li> {@link NormalSsaInsn} instances represent instructions that directly 5099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * correspond to {@code Rop} form. 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </ul> 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <h3>Classes related to optimization steps</h3> 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <ul> 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li> {@link MoveParamCombiner} is a simple step that ensures each method 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * parameter is represented by at most one SSA register. 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li> {@link SCCP} is a (partially implemented) sparse-conditional 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * constant propogator. 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li> {@link LiteralOpUpgrader} is a step that attempts to use constant 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * information to convert math and comparison instructions into 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * constant-bearing "literal ops" in cases where they can be represented in the 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * output form (see {@link TranslationAdvice#hasConstantOperation}). 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li> {@link ConstCollector} is a step that attempts to trade (modest) 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * increased register space for decreased instruction count in cases where 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the same constant value is used repeatedly in a single method. 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li> {@link DeadCodeRemover} is a dead code remover. This phase must 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * always be run to remove unused phi instructions. 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </ul> 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <h2>SSA Lifetime</h2> 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The representation of a method in SSA form obeys slightly different 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * constraints depending upon whether it is in the process of being converted 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * into or out of SSA form. 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <h3>Conversion into SSA Form</h3> 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@link SsaConverter#convertToSsaMethod} takes a {@code RopMethod} and 7899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * returns a fully-converted {@code SsaMethod}. The conversion process 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * is roughly as follows: 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <ol> 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li> The Rop-form method, its blocks and their instructions are directly 8399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * wrapped in {@code SsaMethod}, {@code SsaBasicBlock} and 8499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code SsaInsn} instances. Nothing else changes. 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li> Critical control-flow graph edges are {@link SsaConverter#edgeSplit 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * split} and new basic blocks inserted as required to meet the constraints 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * necessary for the ultimate SSA representation. 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li> A {@link LocalVariableExtractor} is run to produce a table of 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Rop registers to local variables necessary during phi placement. This 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * step could also be done in Rop form and then updated through the preceding 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * steps. 9299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * <li> {@code Phi} instructions are {link SsaConverter#placePhiFunctions} 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * placed in a semi-pruned fashion, which requires computation of {@link 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Dominators dominance graph} and each node's {@link DomFront 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * dominance-frontier set}. 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li> Finally, source and result registers for all instructions are {@link 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * SsaRenamer renamed} such that each assignment is given a unique register 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * number (register categories or widths, significant in Rop form, do not 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * exist in SSA). Move instructions are eliminated except where necessary 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to preserve local variable assignments. 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </ol> 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 104