@Test public void addRangeCreatesNewIntervalWhenThereIsAGapBetweenRanges() { Register reg = new Register(3); CompoundInterval ci = new CompoundInterval(DEFAULT_BEGIN, DEFAULT_END, reg); assertThat(ci.last().getEnd(), is(DEFAULT_END)); RegisterAllocatorState regAllocState = new RegisterAllocatorState(1); LiveIntervalElement live = new LiveIntervalElement(reg, null, null); ControlFlowGraph emptyCfg = new ControlFlowGraph(0); BasicBlock bb = new BasicBlock(1, null, emptyCfg); regAllocState.initializeDepthFirstNumbering(10); regAllocState.setDFN(bb.firstInstruction(), DEFAULT_END + 2); regAllocState.setDFN(bb.lastInstruction(), DEFAULT_END + 3); BasicInterval bi = ci.addRange(regAllocState, live, bb); assertThat(ci.last(), sameInstance(bi)); }
@Test public void addRangeChangesEndOfLastIntervalWhenRangesDirectlyFollowEachOther_NoDefUse() { Register reg = new Register(3); CompoundInterval ci = new CompoundInterval(DEFAULT_BEGIN, DEFAULT_END, reg); assertThat(ci.last().getEnd(), is(DEFAULT_END)); RegisterAllocatorState regAllocState = new RegisterAllocatorState(1); LiveIntervalElement live = new LiveIntervalElement(reg, null, null); ControlFlowGraph emptyCfg = new ControlFlowGraph(0); BasicBlock bb = new BasicBlock(1, null, emptyCfg); regAllocState.initializeDepthFirstNumbering(10); regAllocState.setDFN(bb.firstInstruction(), DEFAULT_END); regAllocState.setDFN(bb.lastInstruction(), DEFAULT_END + 1); BasicInterval bi = ci.addRange(regAllocState, live, bb); assertNull(bi); assertThat(ci.last().getEnd(), is(DEFAULT_END + 1)); }
@Test public void getBasicIntervalRegAllocStateReturnsNullIfNoMatchingIntervalIsFound() { CompoundInterval ci = createCompoundIntervalWithoutRegister(); RegisterAllocatorState regAllocState = new RegisterAllocatorState(1); regAllocState.initializeDepthFirstNumbering(20); Instruction writeFloor = Empty.create(WRITE_FLOOR); regAllocState.setDFN(writeFloor, DEFAULT_BEGIN); ci.getBasicInterval(regAllocState, writeFloor); assertNull(ci.getBasicInterval(10)); }
@Test public void getBasicIntervalRegAllocStateReturnsAnIntervalIfOneMatches() { CompoundInterval ci = createCompoundIntervalWithoutRegister(); RegisterAllocatorState regAllocState = new RegisterAllocatorState(1); regAllocState.initializeDepthFirstNumbering(20); Instruction writeFloor = Empty.create(WRITE_FLOOR); regAllocState.setDFN(writeFloor, DEFAULT_END); BasicInterval bi = ci.getBasicInterval(regAllocState, writeFloor); assertThat(bi.getBegin(), is(DEFAULT_BEGIN)); assertThat(bi.getEnd(), is(DEFAULT_END)); }
@Test public void getBasicIntervalRegAllocStateReturnsIntervalWithGreatestStartIfMultipleMatch() { CompoundInterval ci = new CompoundInterval(DEFAULT_BEGIN, DEFAULT_END, null); ci.add(new BasicInterval(DEFAULT_BEGIN, DEFAULT_END + 1)); RegisterAllocatorState regAllocState = new RegisterAllocatorState(1); regAllocState.initializeDepthFirstNumbering(20); Instruction writeFloor = Empty.create(WRITE_FLOOR); regAllocState.setDFN(writeFloor, DEFAULT_END); BasicInterval bi = ci.getBasicInterval(regAllocState, writeFloor); assertThat(bi.getBegin(), is(DEFAULT_BEGIN)); assertThat(bi.getEnd(), is(DEFAULT_END + 1)); }