DeadCodeRemover.java revision 99409883d9c4c0ffb49b070ce307bb33a9dfe9f1
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 5699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * 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. 6699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * 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++) { 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project // Delete this insn from all usage lists. 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RegisterSpec source = sources.get(i); 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project useList[source.getReg()].remove(insnS); 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!hasSideEffect( 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ssaMeth.getDefinitionForRegister( 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project source.getReg()))) { 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * Only registers whose definition has no side effect 11499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * should be added back to the worklist. 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project worklist.set(source.getReg()); 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 12099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project // Schedule this insn for later deletion. 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project deletedInsns.add(insnS); 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ssaMeth.deleteInsns(deletedInsns); 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns true if the only uses of this register form a circle of 13099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * operations with no side effects. 13199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param regV register to examine 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param set a set of registers that we've already determined 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * are only used as sources in operations with no side effect or null 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if this is the first recursion 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return true if usage is circular without side effect 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private boolean isCircularNoSideEffect(int regV, BitSet set) { 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((set != null) && set.get(regV)) { 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return true; 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 14399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project for (SsaInsn use : useList[regV]) { 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (hasSideEffect(use)) { 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (set == null) { 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project set = new BitSet(regCount); 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // This register is only used in operations that have no side effect. 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project set.set(regV); 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (SsaInsn use: useList[regV]) { 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RegisterSpec result = use.getResult(); 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (result == null 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project || !isCircularNoSideEffect(result.getReg(), set)) { 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return true; 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns true if this insn has a side-effect. Returns true 170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the insn is null for reasons stated in the code block. 17199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * 17299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param insn {@code null-ok;} instruction in question 173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return true if it has a side-effect 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private static boolean hasSideEffect(SsaInsn insn) { 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (insn == null) { 17799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /* While false would seem to make more sense here, true 17899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * prevents us from adding this back to a worklist unnecessarally. 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return true; 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return insn.hasSideEffect(); 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * A callback class used to build up the initial worklist of 188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * registers defined by an instruction with no side effect. 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 19099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project static private class NoSideEffectVisitor implements SsaInsn.Visitor { 191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BitSet noSideEffectRegs; 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Passes in data structures that will be filled out after 195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ssaMeth.forEachInsn() is called with this instance. 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param noSideEffectRegs to-build bitset of regs that are 198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * results of regs with no side effects 199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 20099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project public NoSideEffectVisitor(BitSet noSideEffectRegs) { 201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.noSideEffectRegs = noSideEffectRegs; 202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void visitMoveInsn (NormalSsaInsn insn) { 20699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project // If we're tracking local vars, some moves have side effects. 207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!hasSideEffect(insn)) { 208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project noSideEffectRegs.set(insn.getResult().getReg()); 209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void visitPhiInsn (PhiInsn phi) { 21499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project // If we're tracking local vars, then some phis have side effects. 215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!hasSideEffect(phi)) { 216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project noSideEffectRegs.set(phi.getResult().getReg()); 217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void visitNonMoveInsn (NormalSsaInsn insn) { 222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RegisterSpec result = insn.getResult(); 223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!hasSideEffect(insn) && result != null) { 224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project noSideEffectRegs.set(result.getReg()); 225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 229