L2Pc Operand
An L2PcOperand is an operand of type L2OperandType.PC. It refers to a target L2BasicBlock, that either be branched to at runtime, or captured in some other way that flow control may end up there.
Author
Mark van Gulik
Constructors
Construct a new L2PcOperand that leads to the specified L2BasicBlock. Set isBackward to true if this is a back-link to a loop head,
Functions
Move any registers used as destinations within me into the provided list.
Capture all L2ReadOperands within this operand into the provided List.
Move any registers used as sources within me into the provided list.
Capture all L2WriteOperands within this operand into the provided List.
This is a freshly cloned operand. Adjust it for use in the given L2Instruction. Note that the new instruction has not yet been installed into an L2BasicBlock.
Write a description of this operand to the given StringBuilder.
Append a textual representation of this operand to the provided StringBuilder. If a style change is appropriate while building the string, invoke the warningStyleChange lambda with true to enable the warning style, and false to turn it off again.
Assert that this operand knows its instruction, which should always be the case if the instruction has already been emitted.
Write JVM bytecodes to the JVMTranslator which will push:
Dispatch this L2Operand to the provided L2OperandDispatcher.
Create and install a LongAdder to count visits through this edge in the final JVM code.
This is an operand of the given instruction, which was just added to its basic block. Its instruction was just set.
This is an operand of the given instruction, which was just inserted into its basic block as part of an optimization pass.
This is an operand of the given instruction, which was just removed from its basic block.
Answer the L2ValueManifest for this edge, which describes which L2Registers hold which L2SemanticValues.
If the L2ValueManifest has not yet been stripped from the containing chunk, answer it, otherwise answer null.
Answer the L2 offset at the start of the L2BasicBlock that this operand refers to.
Now that chunk optimization has completed, remove information from this instruction that will no longer be needed in the finished chunk. Note that during subsequent inlining of this chunk at a call site, the type and synonym information will be reconstructed without too much cost.
Replace occurrences in this operand of each register that is a key of this map with the register that is the corresponding value. Do nothing to registers that are not keys of the map. Update all secondary structures, such as the instruction's source/destination collections.
Set the instructionOrNull field.
Answer the source L2BasicBlock that this operand is an edge from.
Create a new L2BasicBlock that will be the new target of this edge, and write an L2_JUMP into the new block to jump to the old target of this edge. Be careful to maintain predecessor order at the target block.
In a non-SSA control flow graph that has had its phi functions removed and converted to moves, switch the target of this edge.
Answer the target L2BasicBlock that this operand refers to.
Transform each L2ReadOperand through the given lambda, producing either a new L2Operand of the same type, or the receiver.
Properties
The Set of L2Registers that are written in all pasts, and are consumed along all future paths after the start of this block. This is only populated during optimization, while the control flow graph is still in SSA form.
A counter of how many times this edge has been traversed. This will be used to determine the amount of effort to apply to subsequent re-optimization attempts, modulating inlining, order of tests, whether to optimize for space, run time, or compile time; that sort of thing. The counter itself (a LongAdder) is passed as a constant through a special class loader, and captured as a final constant within the L2Chunk's class.
Either null, the normal case, or a set with each L2Entity/RegisterKind that is allowed to pass along this edge. This mechanism is used to break control flow cycles, allowing a simple liveness algorithm to be used, instead of iterating (backward) through loops until the live set has converged.
Answer the L2Instruction containing this operand.
Whether this edge points backward to a block marked as L2BasicBlock.isLoopHead, thereby closing a loop.
Answer whether this operand is misconnected to its L2Instruction.
Answer this operand's L2OperandType.
The Set of L2Registers that are written in all pasts, and are consumed along at least one future after the start of this block. This is only populated during optimization, while the control flow graph is still in SSA form.