src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceLinearScanResolveDataFlowPhase.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/trace/lsra/TraceLinearScanResolveDataFlowPhase.java

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

Print this page

        

*** 20,50 **** * or visit www.oracle.com if you need additional information or have any * questions. */ package org.graalvm.compiler.lir.alloc.trace.lsra; import static org.graalvm.compiler.core.common.GraalOptions.DetailedAsserts; import static org.graalvm.compiler.lir.LIRValueUtil.asConstant; import static org.graalvm.compiler.lir.LIRValueUtil.isConstantValue; import static org.graalvm.compiler.lir.LIRValueUtil.isStackSlotValue; import static org.graalvm.compiler.lir.LIRValueUtil.isVirtualStackSlot; - import static jdk.vm.ci.code.ValueUtil.isRegister; ! import java.util.List; import org.graalvm.compiler.core.common.alloc.Trace; import org.graalvm.compiler.core.common.alloc.TraceBuilderResult; import org.graalvm.compiler.core.common.cfg.AbstractBlockBase; import org.graalvm.compiler.debug.Debug; import org.graalvm.compiler.debug.DebugCounter; import org.graalvm.compiler.debug.Indent; import org.graalvm.compiler.lir.LIRInstruction; import org.graalvm.compiler.lir.StandardOp; import org.graalvm.compiler.lir.alloc.trace.lsra.TraceLinearScanPhase.TraceLinearScan; import org.graalvm.compiler.lir.gen.LIRGenerationResult; ! import org.graalvm.compiler.lir.ssa.SSAUtil.PhiValueVisitor; ! import org.graalvm.compiler.lir.ssi.SSIUtil; import jdk.vm.ci.code.TargetDescription; import jdk.vm.ci.meta.Value; /** --- 20,53 ---- * or visit www.oracle.com if you need additional information or have any * questions. */ package org.graalvm.compiler.lir.alloc.trace.lsra; + import static jdk.vm.ci.code.ValueUtil.isRegister; import static org.graalvm.compiler.core.common.GraalOptions.DetailedAsserts; import static org.graalvm.compiler.lir.LIRValueUtil.asConstant; import static org.graalvm.compiler.lir.LIRValueUtil.isConstantValue; import static org.graalvm.compiler.lir.LIRValueUtil.isStackSlotValue; import static org.graalvm.compiler.lir.LIRValueUtil.isVirtualStackSlot; ! import java.util.ArrayList; import org.graalvm.compiler.core.common.alloc.Trace; import org.graalvm.compiler.core.common.alloc.TraceBuilderResult; import org.graalvm.compiler.core.common.cfg.AbstractBlockBase; import org.graalvm.compiler.debug.Debug; import org.graalvm.compiler.debug.DebugCounter; import org.graalvm.compiler.debug.Indent; + import org.graalvm.compiler.lir.LIR; import org.graalvm.compiler.lir.LIRInstruction; import org.graalvm.compiler.lir.StandardOp; + import org.graalvm.compiler.lir.StandardOp.JumpOp; + import org.graalvm.compiler.lir.StandardOp.LabelOp; + import org.graalvm.compiler.lir.alloc.trace.GlobalLivenessInfo; import org.graalvm.compiler.lir.alloc.trace.lsra.TraceLinearScanPhase.TraceLinearScan; import org.graalvm.compiler.lir.gen.LIRGenerationResult; ! import org.graalvm.compiler.lir.ssa.SSAUtil; import jdk.vm.ci.code.TargetDescription; import jdk.vm.ci.meta.Value; /**
*** 74,84 **** if (fromBlock.getSuccessorCount() <= 1) { if (Debug.isLogEnabled()) { Debug.log("inserting moves at end of fromBlock B%d", fromBlock.getId()); } ! List<LIRInstruction> instructions = allocator.getLIR().getLIRforBlock(fromBlock); LIRInstruction instr = instructions.get(instructions.size() - 1); if (instr instanceof StandardOp.JumpOp) { // insert moves before branch moveResolver.setInsertPosition(instructions, instructions.size() - 1); } else { --- 77,87 ---- if (fromBlock.getSuccessorCount() <= 1) { if (Debug.isLogEnabled()) { Debug.log("inserting moves at end of fromBlock B%d", fromBlock.getId()); } ! ArrayList<LIRInstruction> instructions = allocator.getLIR().getLIRforBlock(fromBlock); LIRInstruction instr = instructions.get(instructions.size() - 1); if (instr instanceof StandardOp.JumpOp) { // insert moves before branch moveResolver.setInsertPosition(instructions, instructions.size() - 1); } else {
*** 88,98 **** } else { if (Debug.isLogEnabled()) { Debug.log("inserting moves at beginning of toBlock B%d", toBlock.getId()); } ! if (DetailedAsserts.getValue()) { assert allocator.getLIR().getLIRforBlock(fromBlock).get(0) instanceof StandardOp.LabelOp : "block does not start with a label"; /* * Because the number of predecessor edges matches the number of successor * edges, blocks which are reached by switch statements may have be more than --- 91,101 ---- } else { if (Debug.isLogEnabled()) { Debug.log("inserting moves at beginning of toBlock B%d", toBlock.getId()); } ! if (DetailedAsserts.getValue(allocator.getOptions())) { assert allocator.getLIR().getLIRforBlock(fromBlock).get(0) instanceof StandardOp.LabelOp : "block does not start with a label"; /* * Because the number of predecessor edges matches the number of successor * edges, blocks which are reached by switch statements may have be more than
*** 144,154 **** @SuppressWarnings("try") private void resolveCollectMappings(AbstractBlockBase<?> fromBlock, AbstractBlockBase<?> toBlock, TraceLocalMoveResolver moveResolver) { try (Indent indent0 = Debug.logAndIndent("Edge %s -> %s", fromBlock, toBlock)) { // collect all intervals that have been split between // fromBlock and toBlock ! SSIUtil.forEachValuePair(allocator.getLIR(), toBlock, fromBlock, new MappingCollector(moveResolver, toBlock, fromBlock)); if (moveResolver.hasMappings()) { resolveFindInsertPos(fromBlock, toBlock, moveResolver); moveResolver.resolveAndAppendMoves(); } } --- 147,174 ---- @SuppressWarnings("try") private void resolveCollectMappings(AbstractBlockBase<?> fromBlock, AbstractBlockBase<?> toBlock, TraceLocalMoveResolver moveResolver) { try (Indent indent0 = Debug.logAndIndent("Edge %s -> %s", fromBlock, toBlock)) { // collect all intervals that have been split between // fromBlock and toBlock ! int toId = allocator.getFirstLirInstructionId(toBlock); ! int fromId = allocator.getLastLirInstructionId(fromBlock); ! assert fromId >= 0; ! LIR lir = allocator.getLIR(); ! if (SSAUtil.isMerge(toBlock)) { ! JumpOp blockEnd = SSAUtil.phiOut(lir, fromBlock); ! LabelOp label = SSAUtil.phiIn(lir, toBlock); ! for (int i = 0; i < label.getPhiSize(); i++) { ! addMapping(blockEnd.getOutgoingValue(i), label.getIncomingValue(i), fromId, toId, moveResolver); ! } ! } ! GlobalLivenessInfo livenessInfo = allocator.getGlobalLivenessInfo(); ! int[] locTo = livenessInfo.getBlockIn(toBlock); ! for (int i = 0; i < locTo.length; i++) { ! TraceInterval interval = allocator.intervalFor(locTo[i]); ! addMapping(interval, interval, fromId, toId, moveResolver); ! } ! if (moveResolver.hasMappings()) { resolveFindInsertPos(fromBlock, toBlock, moveResolver); moveResolver.resolveAndAppendMoves(); } }
*** 156,208 **** private boolean containedInTrace(Trace currentTrace, AbstractBlockBase<?> block) { return currentTrace.getId() == traceBuilderResult.getTraceForBlock(block).getId(); } ! private static final DebugCounter numSSIResolutionMoves = Debug.counter("SSI LSRA[numSSIResolutionMoves]"); ! private static final DebugCounter numStackToStackMoves = Debug.counter("SSI LSRA[numStackToStackMoves]"); ! ! private class MappingCollector implements PhiValueVisitor { ! final TraceLocalMoveResolver moveResolver; ! final int toId; ! final int fromId; ! ! MappingCollector(TraceLocalMoveResolver moveResolver, AbstractBlockBase<?> toBlock, AbstractBlockBase<?> fromBlock) { ! this.moveResolver = moveResolver; ! toId = allocator.getFirstLirInstructionId(toBlock); ! fromId = allocator.getLastLirInstructionId(fromBlock); ! assert fromId >= 0; ! } ! @Override ! public void visit(Value phiIn, Value phiOut) { ! assert !isRegister(phiOut) : "Out is a register: " + phiOut; ! assert !isRegister(phiIn) : "In is a register: " + phiIn; ! if (Value.ILLEGAL.equals(phiIn)) { ! // The value not needed in this branch. ! return; ! } ! if (isVirtualStackSlot(phiIn) && isVirtualStackSlot(phiOut) && phiIn.equals(phiOut)) { // no need to handle virtual stack slots return; } ! TraceInterval toInterval = allocator.splitChildAtOpId(allocator.intervalFor(phiIn), toId, LIRInstruction.OperandMode.DEF); ! if (isConstantValue(phiOut)) { ! numSSIResolutionMoves.increment(); ! moveResolver.addMapping(asConstant(phiOut), toInterval); ! } else { ! TraceInterval fromInterval = allocator.splitChildAtOpId(allocator.intervalFor(phiOut), fromId, LIRInstruction.OperandMode.DEF); ! if (fromInterval != toInterval) { ! numSSIResolutionMoves.increment(); ! if (!(isStackSlotValue(toInterval.location()) && isStackSlotValue(fromInterval.location()))) { ! moveResolver.addMapping(fromInterval, toInterval); } else { ! numStackToStackMoves.increment(); ! moveResolver.addMapping(fromInterval, toInterval); } } } } } } } --- 176,219 ---- private boolean containedInTrace(Trace currentTrace, AbstractBlockBase<?> block) { return currentTrace.getId() == traceBuilderResult.getTraceForBlock(block).getId(); } ! private static final DebugCounter numResolutionMoves = Debug.counter("TraceRA[numTraceLSRAResolutionMoves]"); ! private static final DebugCounter numStackToStackMoves = Debug.counter("TraceRA[numTraceLSRAStackToStackMoves]"); ! private void addMapping(Value phiFrom, Value phiTo, int fromId, int toId, TraceLocalMoveResolver moveResolver) { ! assert !isRegister(phiFrom) : "Out is a register: " + phiFrom; ! assert !isRegister(phiTo) : "In is a register: " + phiTo; ! assert !Value.ILLEGAL.equals(phiTo) : "The value not needed in this branch? " + phiFrom; ! if (isVirtualStackSlot(phiTo) && isVirtualStackSlot(phiFrom) && phiTo.equals(phiFrom)) { // no need to handle virtual stack slots return; } ! TraceInterval toParent = allocator.intervalFor(phiTo); ! if (isConstantValue(phiFrom)) { ! numResolutionMoves.increment(); ! TraceInterval toInterval = allocator.splitChildAtOpId(toParent, toId, LIRInstruction.OperandMode.DEF); ! moveResolver.addMapping(asConstant(phiFrom), toInterval); } else { ! addMapping(allocator.intervalFor(phiFrom), toParent, fromId, toId, moveResolver); } } + + private void addMapping(TraceInterval fromParent, TraceInterval toParent, int fromId, int toId, TraceLocalMoveResolver moveResolver) { + TraceInterval fromInterval = allocator.splitChildAtOpId(fromParent, fromId, LIRInstruction.OperandMode.USE); + TraceInterval toInterval = toParent.getSplitChildAtOpIdOrNull(toId, LIRInstruction.OperandMode.DEF); + if (toInterval == null) { + // not alive + return; + } + if (fromInterval != toInterval) { + numResolutionMoves.increment(); + if (numStackToStackMoves.isEnabled() && isStackSlotValue(toInterval.location()) && isStackSlotValue(fromInterval.location())) { + numStackToStackMoves.increment(); } + moveResolver.addMapping(fromInterval, toInterval); } } } }
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceLinearScanResolveDataFlowPhase.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File