/** * Constructs instance. * * @param ssaMeth {@code non-null;} method to process * @param interference non-null interference graph for SSA registers * @param minimizeRegisters true if converter should take steps to * minimize rop-form registers */ public FirstFitLocalCombiningAllocator( SsaMethod ssaMeth, InterferenceGraph interference, boolean minimizeRegisters) { super(ssaMeth, interference); ssaRegsMapped = new BitSet(ssaMeth.getRegCount()); mapper = new InterferenceRegisterMapper( interference, ssaMeth.getRegCount()); this.minimizeRegisters = minimizeRegisters; /* * Reserve space for the params at the bottom of the register * space. Later, we'll flip the params to the end of the register * space. */ paramRangeEnd = ssaMeth.getParamWidth(); reservedRopRegs = new BitSet(paramRangeEnd * 2); reservedRopRegs.set(0, paramRangeEnd); usedRopRegs = new BitSet(paramRangeEnd * 2); localVariables = new TreeMap<LocalItem, ArrayList<RegisterSpec>>(); moveResultPseudoInsns = new ArrayList<NormalSsaInsn>(); invokeRangeInsns = new ArrayList<NormalSsaInsn>(); phiInsns = new ArrayList<PhiInsn>(); }
/** {@inheritDoc} */ @Override public void addMapping(int oldReg, int newReg, int category) { super.addMapping(oldReg, newReg, category); addInterfence(newReg, oldReg); if (category == 2) { addInterfence(newReg + 1, oldReg); } }
/** * Checks to see if old namespace reg {@code oldReg} interferes * with what currently maps to {@code newReg}. * * @param oldSpec {@code non-null;} old namespace register * @param newReg new namespace register * @return true if oldReg will interfere with newReg */ public boolean interferes(RegisterSpec oldSpec, int newReg) { return interferes(oldSpec.getReg(), newReg, oldSpec.getCategory()); }
&& mapper.oldToNew(ssaReg) == ropReg) { } else if (!mapper.areAnyPinned(liveOutSpecs, ropReg, category) && !mapper.areAnyPinned(sources, ropReg, category)) {
/** * Adds a mapping from an SSA register to a rop register. * {@link #canMapReg} should have already been called. * * @param ssaSpec {@code non-null;} SSA register to map from * @param ropReg {@code >=0;} rop register to map to */ private void addMapping(RegisterSpec ssaSpec, int ropReg) { int ssaReg = ssaSpec.getReg(); // An assertion. if (ssaRegsMapped.get(ssaReg) || !canMapReg(ssaSpec, ropReg)) { throw new RuntimeException( "attempt to add invalid register mapping"); } if (DEBUG) { System.out.printf("Add mapping s%d -> v%d c:%d\n", ssaSpec.getReg(), ropReg, ssaSpec.getCategory()); } int category = ssaSpec.getCategory(); mapper.addMapping(ssaSpec.getReg(), ropReg, category); ssaRegsMapped.set(ssaReg); usedRopRegs.set(ropReg, ropReg + category); }
&& mapper.oldToNew(ssaReg) == ropReg) { } else if (!mapper.areAnyPinned(liveOutSpecs, ropReg, category) && !mapper.areAnyPinned(sources, ropReg, category)) {
int r = oldToNew(oldSpec.getReg());
/** * Adds a mapping from an SSA register to a rop register. * {@link #canMapReg} should have already been called. * * @param ssaSpec {@code non-null;} SSA register to map from * @param ropReg {@code >=0;} rop register to map to */ private void addMapping(RegisterSpec ssaSpec, int ropReg) { int ssaReg = ssaSpec.getReg(); // An assertion. if (ssaRegsMapped.get(ssaReg) || !canMapReg(ssaSpec, ropReg)) { throw new RuntimeException( "attempt to add invalid register mapping"); } if (DEBUG) { System.out.printf("Add mapping s%d -> v%d c:%d\n", ssaSpec.getReg(), ropReg, ssaSpec.getCategory()); } int category = ssaSpec.getCategory(); mapper.addMapping(ssaSpec.getReg(), ropReg, category); ssaRegsMapped.set(ssaReg); usedRopRegs.set(ropReg, ropReg + category); }
&& mapper.oldToNew(ssaReg) == ropReg) { } else if (!mapper.areAnyPinned(liveOutSpecs, ropReg, category) && !mapper.areAnyPinned(sources, ropReg, category)) {
int r = oldToNew(oldSpec.getReg());
/** * Checks to see if old namespace reg {@code oldReg} interferes * with what currently maps to {@code newReg}. * * @param oldSpec {@code non-null;} old namespace register * @param newReg new namespace register * @return true if oldReg will interfere with newReg */ public boolean interferes(RegisterSpec oldSpec, int newReg) { return interferes(oldSpec.getReg(), newReg, oldSpec.getCategory()); }
/** {@inheritDoc} */ @Override public void addMapping(int oldReg, int newReg, int category) { super.addMapping(oldReg, newReg, category); addInterfence(newReg, oldReg); if (category == 2) { addInterfence(newReg + 1, oldReg); } }
/** * Adds a mapping from an SSA register to a rop register. * {@link #canMapReg} should have already been called. * * @param ssaSpec {@code non-null;} SSA register to map from * @param ropReg {@code >=0;} rop register to map to */ private void addMapping(RegisterSpec ssaSpec, int ropReg) { int ssaReg = ssaSpec.getReg(); // An assertion. if (ssaRegsMapped.get(ssaReg) || !canMapReg(ssaSpec, ropReg)) { throw new RuntimeException( "attempt to add invalid register mapping"); } if (DEBUG) { System.out.printf("Add mapping s%d -> v%d c:%d\n", ssaSpec.getReg(), ropReg, ssaSpec.getCategory()); } int category = ssaSpec.getCategory(); mapper.addMapping(ssaSpec.getReg(), ropReg, category); ssaRegsMapped.set(ssaReg); usedRopRegs.set(ropReg, ropReg + category); }
/** * Constructs instance. * * @param ssaMeth {@code non-null;} method to process * @param interference non-null interference graph for SSA registers * @param minimizeRegisters true if converter should take steps to * minimize rop-form registers */ public FirstFitLocalCombiningAllocator( SsaMethod ssaMeth, InterferenceGraph interference, boolean minimizeRegisters) { super(ssaMeth, interference); ssaRegsMapped = new BitSet(ssaMeth.getRegCount()); mapper = new InterferenceRegisterMapper( interference, ssaMeth.getRegCount()); /* * Reserve space for the params at the bottom of the register * space. Later, we'll flip the params to the end of the register * space. */ paramRangeEnd = ssaMeth.getParamWidth(); reservedRopRegs = new BitSet(paramRangeEnd * 2); reservedRopRegs.set(0, paramRangeEnd); usedRopRegs = new BitSet(paramRangeEnd * 2); localVariables = new TreeMap<LocalItem, ArrayList<RegisterSpec>>(); moveResultPseudoInsns = new ArrayList<NormalSsaInsn>(); invokeRangeInsns = new ArrayList<NormalSsaInsn>(); phiInsns = new ArrayList<PhiInsn>(); }
&& mapper.oldToNew(ssaReg) == ropReg) { } else if (!mapper.areAnyPinned(liveOutSpecs, ropReg, category) && !mapper.areAnyPinned(sources, ropReg, category)) {
int r = oldToNew(oldSpec.getReg());
/** * Checks to see if old namespace reg {@code oldReg} interferes * with what currently maps to {@code newReg}. * * @param oldSpec {@code non-null;} old namespace register * @param newReg new namespace register * @return true if oldReg will interfere with newReg */ public boolean interferes(RegisterSpec oldSpec, int newReg) { return interferes(oldSpec.getReg(), newReg, oldSpec.getCategory()); }
/** {@inheritDoc} */ @Override public void addMapping(int oldReg, int newReg, int category) { super.addMapping(oldReg, newReg, category); addInterfence(newReg, oldReg); if (category == 2) { addInterfence(newReg + 1, oldReg); } }
/** * Adds a mapping from an SSA register to a rop register. * {@link #canMapReg} should have already been called. * * @param ssaSpec {@code non-null;} SSA register to map from * @param ropReg {@code >=0;} rop register to map to */ private void addMapping(RegisterSpec ssaSpec, int ropReg) { int ssaReg = ssaSpec.getReg(); // An assertion. if (ssaRegsMapped.get(ssaReg) || !canMapReg(ssaSpec, ropReg)) { throw new RuntimeException( "attempt to add invalid register mapping"); } if (DEBUG) { System.out.printf("Add mapping s%d -> v%d c:%d\n", ssaSpec.getReg(), ropReg, ssaSpec.getCategory()); } int category = ssaSpec.getCategory(); mapper.addMapping(ssaSpec.getReg(), ropReg, category); ssaRegsMapped.set(ssaReg); usedRopRegs.set(ropReg, ropReg + category); }