src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/RegisterVerifier.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hotspot Cdiff src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/RegisterVerifier.java

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/RegisterVerifier.java

Print this page

        

*** 28,39 **** import java.util.ArrayList; import java.util.EnumSet; import org.graalvm.compiler.core.common.cfg.AbstractBlockBase; import org.graalvm.compiler.core.common.cfg.BlockMap; ! import org.graalvm.compiler.debug.Debug; ! import org.graalvm.compiler.debug.Debug.Scope; import org.graalvm.compiler.debug.GraalError; import org.graalvm.compiler.debug.Indent; import org.graalvm.compiler.lir.InstructionValueConsumer; import org.graalvm.compiler.lir.LIRInstruction; import org.graalvm.compiler.lir.LIRInstruction.OperandFlag; --- 28,38 ---- import java.util.ArrayList; import java.util.EnumSet; import org.graalvm.compiler.core.common.cfg.AbstractBlockBase; import org.graalvm.compiler.core.common.cfg.BlockMap; ! import org.graalvm.compiler.debug.DebugContext; import org.graalvm.compiler.debug.GraalError; import org.graalvm.compiler.debug.Indent; import org.graalvm.compiler.lir.InstructionValueConsumer; import org.graalvm.compiler.lir.LIRInstruction; import org.graalvm.compiler.lir.LIRInstruction.OperandFlag;
*** 82,92 **** } @SuppressWarnings("try") void verify(AbstractBlockBase<?> start) { ! try (Scope s = Debug.scope("RegisterVerifier")) { // setup input registers (method arguments) for first block Interval[] inputState = new Interval[stateSize()]; setStateForBlock(start, inputState); addToWorkList(start); --- 81,92 ---- } @SuppressWarnings("try") void verify(AbstractBlockBase<?> start) { ! DebugContext debug = allocator.getDebug(); ! try (DebugContext.Scope s = debug.scope("RegisterVerifier")) { // setup input registers (method arguments) for first block Interval[] inputState = new Interval[stateSize()]; setStateForBlock(start, inputState); addToWorkList(start);
*** 100,121 **** } } @SuppressWarnings("try") private void processBlock(AbstractBlockBase<?> block) { ! try (Indent indent = Debug.logAndIndent("processBlock B%d", block.getId())) { // must copy state because it is modified Interval[] inputState = copy(stateForBlock(block)); ! try (Indent indent2 = Debug.logAndIndent("Input-State of intervals:")) { printState(inputState); } // process all operations of the block processOperations(block, inputState); ! try (Indent indent2 = Debug.logAndIndent("Output-State of intervals:")) { printState(inputState); } // iterate all successors for (AbstractBlockBase<?> succ : block.getSuccessors()) { --- 100,122 ---- } } @SuppressWarnings("try") private void processBlock(AbstractBlockBase<?> block) { ! DebugContext debug = allocator.getDebug(); ! try (Indent indent = debug.logAndIndent("processBlock B%d", block.getId())) { // must copy state because it is modified Interval[] inputState = copy(stateForBlock(block)); ! try (Indent indent2 = debug.logAndIndent("Input-State of intervals:")) { printState(inputState); } // process all operations of the block processOperations(block, inputState); ! try (Indent indent2 = debug.logAndIndent("Output-State of intervals:")) { printState(inputState); } // iterate all successors for (AbstractBlockBase<?> succ : block.getSuccessors()) {
*** 123,144 **** } } } protected void printState(Interval[] inputState) { for (int i = 0; i < stateSize(); i++) { Register reg = allocator.getRegisters().get(i); assert reg.number == i; if (inputState[i] != null) { ! Debug.log(" %6s %4d -- %s", reg, inputState[i].operandNumber, inputState[i]); } else { ! Debug.log(" %6s __", reg); } } } private void processSuccessor(AbstractBlockBase<?> block, Interval[] inputState) { Interval[] savedState = stateForBlock(block); if (savedState != null) { // this block was already processed before. // check if new inputState is consistent with savedState --- 124,147 ---- } } } protected void printState(Interval[] inputState) { + DebugContext debug = allocator.getDebug(); for (int i = 0; i < stateSize(); i++) { Register reg = allocator.getRegisters().get(i); assert reg.number == i; if (inputState[i] != null) { ! debug.log(" %6s %4d -- %s", reg, inputState[i].operandNumber, inputState[i]); } else { ! debug.log(" %6s __", reg); } } } private void processSuccessor(AbstractBlockBase<?> block, Interval[] inputState) { + DebugContext debug = allocator.getDebug(); Interval[] savedState = stateForBlock(block); if (savedState != null) { // this block was already processed before. // check if new inputState is consistent with savedState
*** 153,197 **** // register was valid. when the register was already invalid, // then the old calculation was correct. savedStateCorrect = false; savedState[i] = null; ! Debug.log("processSuccessor B%d: invalidating slot %d", block.getId(), i); } } } if (savedStateCorrect) { // already processed block with correct inputState ! Debug.log("processSuccessor B%d: previous visit already correct", block.getId()); } else { // must re-visit this block ! Debug.log("processSuccessor B%d: must re-visit because input state changed", block.getId()); addToWorkList(block); } } else { // block was not processed before, so set initial inputState ! Debug.log("processSuccessor B%d: initial visit", block.getId()); setStateForBlock(block, copy(inputState)); addToWorkList(block); } } static Interval[] copy(Interval[] inputState) { return inputState.clone(); } ! static void statePut(Interval[] inputState, Value location, Interval interval) { if (location != null && isRegister(location)) { Register reg = asRegister(location); int regNum = reg.number; if (interval != null) { ! Debug.log("%s = %s", reg, interval.operand); } else if (inputState[regNum] != null) { ! Debug.log("%s = null", reg); } inputState[regNum] = interval; } } --- 156,200 ---- // register was valid. when the register was already invalid, // then the old calculation was correct. savedStateCorrect = false; savedState[i] = null; ! debug.log("processSuccessor B%d: invalidating slot %d", block.getId(), i); } } } if (savedStateCorrect) { // already processed block with correct inputState ! debug.log("processSuccessor B%d: previous visit already correct", block.getId()); } else { // must re-visit this block ! debug.log("processSuccessor B%d: must re-visit because input state changed", block.getId()); addToWorkList(block); } } else { // block was not processed before, so set initial inputState ! debug.log("processSuccessor B%d: initial visit", block.getId()); setStateForBlock(block, copy(inputState)); addToWorkList(block); } } static Interval[] copy(Interval[] inputState) { return inputState.clone(); } ! static void statePut(DebugContext debug, Interval[] inputState, Value location, Interval interval) { if (location != null && isRegister(location)) { Register reg = asRegister(location); int regNum = reg.number; if (interval != null) { ! debug.log("%s = %s", reg, interval.operand); } else if (inputState[regNum] != null) { ! debug.log("%s = null", reg); } inputState[regNum] = interval; } }
*** 207,216 **** --- 210,220 ---- return true; } void processOperations(AbstractBlockBase<?> block, final Interval[] inputState) { ArrayList<LIRInstruction> ops = allocator.getLIR().getLIRforBlock(block); + DebugContext debug = allocator.getDebug(); InstructionValueConsumer useConsumer = new InstructionValueConsumer() { @Override public void visitValue(LIRInstruction op, Value operand, OperandMode mode, EnumSet<OperandFlag> flags) { // we skip spill moves inserted by the spill position optimization
*** 230,257 **** Interval interval = intervalAt(operand); if (op.id() != -1) { interval = interval.getSplitChildAtOpId(op.id(), mode, allocator); } ! statePut(inputState, interval.location(), interval.splitParent()); } }; // visit all instructions of the block for (int i = 0; i < ops.size(); i++) { final LIRInstruction op = ops.get(i); ! if (Debug.isLogEnabled()) { ! Debug.log("%s", op.toStringWithIdPrefix()); } // check if input operands are correct op.visitEachInput(useConsumer); // invalidate all caller save registers at calls if (op.destroysCallerSavedRegisters()) { for (Register r : allocator.getRegisterAllocationConfig().getRegisterConfig().getCallerSaveRegisters()) { ! statePut(inputState, r.asValue(), null); } } op.visitEachAlive(useConsumer); // set temp operands (some operations use temp operands also as output operands, so // can't set them null) --- 234,261 ---- Interval interval = intervalAt(operand); if (op.id() != -1) { interval = interval.getSplitChildAtOpId(op.id(), mode, allocator); } ! statePut(debug, inputState, interval.location(), interval.splitParent()); } }; // visit all instructions of the block for (int i = 0; i < ops.size(); i++) { final LIRInstruction op = ops.get(i); ! if (debug.isLogEnabled()) { ! debug.log("%s", op.toStringWithIdPrefix()); } // check if input operands are correct op.visitEachInput(useConsumer); // invalidate all caller save registers at calls if (op.destroysCallerSavedRegisters()) { for (Register r : allocator.getRegisterAllocationConfig().getRegisterConfig().getCallerSaveRegisters()) { ! statePut(debug, inputState, r.asValue(), null); } } op.visitEachAlive(useConsumer); // set temp operands (some operations use temp operands also as output operands, so // can't set them null)
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/RegisterVerifier.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File