DeadCodeRemover.java revision de75089fb7216d19e9c22cce4dc62a49513477d3
1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2007 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 Projectimport com.android.dx.rop.code.RegOps; 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.RegisterSpec; 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.RegisterSpecList; 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.Rop; 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.PlainInsn; 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.Rops; 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.SourcePosition; 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.Insn; 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.ArrayList; 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.BitSet; 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.HashSet; 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * A variation on Appel Algorithm 19.12 "Dead code elimination in SSA form". 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TODO this algorithm is more efficient if run in reverse from exit 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * block to entry block. 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class DeadCodeRemover { 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** method we're processing */ 4099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project private final SsaMethod ssaMeth; 4199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** ssaMeth.getRegCount() */ 4399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project private final int regCount; 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * indexed by register: whether reg should be examined 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (does it correspond to a no-side-effect insn?) 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project private final BitSet worklist; 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** use list indexed by register; modified during operation */ 5299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project private final ArrayList<SsaInsn>[] useList; 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Process a method with the dead-code remver 56de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param ssaMethod method to process 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static void process(SsaMethod ssaMethod) { 6099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project DeadCodeRemover dc = new DeadCodeRemover(ssaMethod); 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dc.run(); 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** 6599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * Constructs an instance. 66de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 6799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param ssaMethod method to process 6899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project */ 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private DeadCodeRemover(SsaMethod ssaMethod) { 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.ssaMeth = ssaMethod; 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project regCount = ssaMethod.getRegCount(); 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project worklist = new BitSet(regCount); 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project useList = ssaMeth.getUseListCopy(); 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 7899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * Runs the dead code remover. 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private void run() { 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project HashSet<SsaInsn> deletedInsns = (HashSet<SsaInsn>) new HashSet(); 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ssaMeth.forEachInsn(new NoSideEffectVisitor(worklist)); 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int regV; 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project while ( 0 <= (regV = worklist.nextSetBit(0)) ) { 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project worklist.clear(regV); 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (useList[regV].size() == 0 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project || isCircularNoSideEffect(regV, null)) { 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SsaInsn insnS = ssaMeth.getDefinitionForRegister(regV); 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project // This insn has already been deleted. 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (deletedInsns.contains(insnS)) { 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project continue; 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RegisterSpecList sources = insnS.getSources(); 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int sz = sources.size(); 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 0; i < sz; i++) { 10499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project // Delete this insn from all usage lists. 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RegisterSpec source = sources.get(i); 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project useList[source.getReg()].remove(insnS); 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!hasSideEffect( 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ssaMeth.getDefinitionForRegister( 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project source.getReg()))) { 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * Only registers whose definition has no side effect 11399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * should be added back to the worklist. 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project worklist.set(source.getReg()); 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 11999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project // Schedule this insn for later deletion. 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project deletedInsns.add(insnS); 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ssaMeth.deleteInsns(deletedInsns); 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns true if the only uses of this register form a circle of 12999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * operations with no side effects. 130de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param regV register to examine 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param set a set of registers that we've already determined 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * are only used as sources in operations with no side effect or null 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if this is the first recursion 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return true if usage is circular without side effect 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private boolean isCircularNoSideEffect(int regV, BitSet set) { 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((set != null) && set.get(regV)) { 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return true; 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 14299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project for (SsaInsn use : useList[regV]) { 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (hasSideEffect(use)) { 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (set == null) { 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project set = new BitSet(regCount); 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // This register is only used in operations that have no side effect. 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project set.set(regV); 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 15541aecd0a6bfea1e9a6713014b2b3d56fec8c552cDan Bornstein for (SsaInsn use : useList[regV]) { 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RegisterSpec result = use.getResult(); 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (result == null 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project || !isCircularNoSideEffect(result.getReg(), set)) { 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return true; 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns true if this insn has a side-effect. Returns true 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the insn is null for reasons stated in the code block. 17099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * 17199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param insn {@code null-ok;} instruction in question 172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return true if it has a side-effect 173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private static boolean hasSideEffect(SsaInsn insn) { 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (insn == null) { 17699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /* While false would seem to make more sense here, true 17799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * prevents us from adding this back to a worklist unnecessarally. 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return true; 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 182de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro return insn.hasSideEffect(); 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * A callback class used to build up the initial worklist of 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * registers defined by an instruction with no side effect. 188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 18999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project static private class NoSideEffectVisitor implements SsaInsn.Visitor { 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BitSet noSideEffectRegs; 191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Passes in data structures that will be filled out after 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ssaMeth.forEachInsn() is called with this instance. 195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param noSideEffectRegs to-build bitset of regs that are 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * results of regs with no side effects 198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 19999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project public NoSideEffectVisitor(BitSet noSideEffectRegs) { 200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.noSideEffectRegs = noSideEffectRegs; 201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void visitMoveInsn (NormalSsaInsn insn) { 20599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project // If we're tracking local vars, some moves have side effects. 206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!hasSideEffect(insn)) { 207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project noSideEffectRegs.set(insn.getResult().getReg()); 208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void visitPhiInsn (PhiInsn phi) { 21399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project // If we're tracking local vars, then some phis have side effects. 214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!hasSideEffect(phi)) { 215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project noSideEffectRegs.set(phi.getResult().getReg()); 216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void visitNonMoveInsn (NormalSsaInsn insn) { 221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RegisterSpec result = insn.getResult(); 222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!hasSideEffect(insn) && result != null) { 223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project noSideEffectRegs.set(result.getReg()); 224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 228