public abstract class NodeLIRBuilder extends Object implements com.oracle.graal.nodes.spi.NodeLIRBuilderTool, com.oracle.graal.lir.debug.LIRGenerationDebugContext
Modifier and Type | Field and Description |
---|---|
private com.oracle.graal.nodes.ValueNode |
currentInstruction |
private DebugInfoBuilder |
debugInfoBuilder |
protected com.oracle.graal.lir.gen.LIRGeneratorTool |
gen |
private com.oracle.graal.nodes.ValueNode |
lastInstructionPrinted |
private Map<Class<? extends com.oracle.graal.graph.Node>,List<MatchStatement>> |
matchRules |
private com.oracle.graal.graph.NodeMap<jdk.internal.jvmci.meta.Value> |
nodeOperands |
Constructor and Description |
---|
NodeLIRBuilder(com.oracle.graal.nodes.StructuredGraph graph,
com.oracle.graal.lir.gen.LIRGeneratorTool gen) |
Modifier and Type | Method and Description |
---|---|
void |
append(com.oracle.graal.lir.LIRInstruction op) |
protected DebugInfoBuilder |
createDebugInfoBuilder(com.oracle.graal.nodes.StructuredGraph graph,
com.oracle.graal.nodes.spi.NodeValueMap nodeValueMap) |
private jdk.internal.jvmci.meta.Value[] |
createPhiIn(com.oracle.graal.nodes.AbstractMergeNode merge) |
private jdk.internal.jvmci.meta.Value[] |
createPhiOut(com.oracle.graal.nodes.AbstractMergeNode merge,
com.oracle.graal.nodes.AbstractEndNode pred) |
void |
doBlock(com.oracle.graal.nodes.cfg.Block block,
com.oracle.graal.nodes.StructuredGraph graph,
com.oracle.graal.compiler.common.cfg.BlockMap<List<com.oracle.graal.graph.Node>> blockMap) |
private void |
doRoot(com.oracle.graal.nodes.ValueNode instr) |
void |
emitBranch(com.oracle.graal.nodes.LogicNode node,
com.oracle.graal.lir.LabelRef trueSuccessor,
com.oracle.graal.lir.LabelRef falseSuccessor,
double trueSuccessorProbability) |
void |
emitCompareBranch(com.oracle.graal.nodes.calc.CompareNode compare,
com.oracle.graal.lir.LabelRef trueSuccessor,
com.oracle.graal.lir.LabelRef falseSuccessor,
double trueSuccessorProbability) |
void |
emitConditional(com.oracle.graal.nodes.calc.ConditionalNode conditional) |
com.oracle.graal.lir.Variable |
emitConditional(com.oracle.graal.nodes.LogicNode node,
jdk.internal.jvmci.meta.Value trueValue,
jdk.internal.jvmci.meta.Value falseValue) |
void |
emitConstantBranch(boolean value,
com.oracle.graal.lir.LabelRef trueSuccessorBlock,
com.oracle.graal.lir.LabelRef falseSuccessorBlock) |
protected abstract void |
emitDirectCall(com.oracle.graal.nodes.DirectCallTargetNode callTarget,
jdk.internal.jvmci.meta.Value result,
jdk.internal.jvmci.meta.Value[] parameters,
jdk.internal.jvmci.meta.Value[] temps,
com.oracle.graal.lir.LIRFrameState callState) |
void |
emitIf(com.oracle.graal.nodes.IfNode x) |
protected abstract void |
emitIndirectCall(com.oracle.graal.nodes.IndirectCallTargetNode callTarget,
jdk.internal.jvmci.meta.Value result,
jdk.internal.jvmci.meta.Value[] parameters,
jdk.internal.jvmci.meta.Value[] temps,
com.oracle.graal.lir.LIRFrameState callState) |
void |
emitIntegerTestBranch(com.oracle.graal.nodes.calc.IntegerTestNode test,
com.oracle.graal.lir.LabelRef trueSuccessor,
com.oracle.graal.lir.LabelRef falseSuccessor,
double trueSuccessorProbability) |
void |
emitInvoke(com.oracle.graal.nodes.Invoke x) |
protected void |
emitNode(com.oracle.graal.nodes.ValueNode node) |
private void |
emitNullCheckBranch(com.oracle.graal.nodes.calc.IsNullNode node,
com.oracle.graal.lir.LabelRef trueSuccessor,
com.oracle.graal.lir.LabelRef falseSuccessor,
double trueSuccessorProbability) |
void |
emitOverflowCheckBranch(com.oracle.graal.nodes.AbstractBeginNode overflowSuccessor,
com.oracle.graal.nodes.AbstractBeginNode next,
com.oracle.graal.compiler.common.type.Stamp stamp,
double probability) |
protected void |
emitPrologue(com.oracle.graal.nodes.StructuredGraph graph) |
void |
emitSwitch(com.oracle.graal.nodes.extended.SwitchNode x)
This method tries to create a switch implementation that is optimal for the given switch.
|
DebugInfoBuilder |
getDebugInfoBuilder() |
protected jdk.internal.jvmci.meta.LIRKind |
getExactPhiKind(com.oracle.graal.nodes.PhiNode phi) |
private static com.oracle.graal.nodes.FrameState |
getFrameState(com.oracle.graal.nodes.DeoptimizingNode deopt) |
com.oracle.graal.lir.LabelRef |
getLIRBlock(com.oracle.graal.nodes.FixedNode b) |
com.oracle.graal.lir.gen.LIRGeneratorTool |
getLIRGeneratorTool() |
private jdk.internal.jvmci.meta.Value |
getOperand(com.oracle.graal.graph.Node node) |
protected jdk.internal.jvmci.meta.LIRKind |
getPhiKind(com.oracle.graal.nodes.PhiNode phi) |
Object |
getSourceForOperand(jdk.internal.jvmci.meta.Value value) |
boolean |
hasOperand(com.oracle.graal.graph.Node node) |
private static boolean |
isPhiInputFromBackedge(com.oracle.graal.nodes.PhiNode phi,
int index) |
protected void |
matchComplexExpressions(List<com.oracle.graal.graph.Node> nodes) |
private void |
moveToPhi(com.oracle.graal.nodes.AbstractMergeNode merge,
com.oracle.graal.nodes.AbstractEndNode pred) |
protected com.oracle.graal.lir.StandardOp.JumpOp |
newJumpOp(com.oracle.graal.lir.LabelRef ref) |
jdk.internal.jvmci.meta.Value |
operand(com.oracle.graal.graph.Node node)
Returns the operand that has been previously initialized by
setResult(ValueNode, Value) with the result of an instruction. |
private jdk.internal.jvmci.meta.Value |
operandForPhi(com.oracle.graal.nodes.ValuePhiNode phi) |
protected abstract boolean |
peephole(com.oracle.graal.nodes.ValueNode valueNode) |
void |
setMatchResult(com.oracle.graal.graph.Node x,
jdk.internal.jvmci.meta.Value operand)
Used by the
MatchStatement machinery to override the generation LIR for some
ValueNodes. |
jdk.internal.jvmci.meta.Value |
setResult(com.oracle.graal.nodes.ValueNode x,
jdk.internal.jvmci.meta.Value operand) |
com.oracle.graal.lir.LIRFrameState |
state(com.oracle.graal.nodes.DeoptimizingNode deopt) |
com.oracle.graal.lir.LIRFrameState |
stateFor(com.oracle.graal.nodes.FrameState state) |
com.oracle.graal.lir.LIRFrameState |
stateForWithExceptionEdge(com.oracle.graal.nodes.FrameState state,
com.oracle.graal.lir.LabelRef exceptionEdge) |
com.oracle.graal.lir.LIRFrameState |
stateWithExceptionEdge(com.oracle.graal.nodes.DeoptimizingNode deopt,
com.oracle.graal.lir.LabelRef exceptionEdge) |
com.oracle.graal.nodes.ValueNode |
valueForOperand(jdk.internal.jvmci.meta.Value value) |
private static boolean |
verifyPHIKind(jdk.internal.jvmci.meta.LIRKind derivedKind,
jdk.internal.jvmci.meta.LIRKind phiKind) |
void |
visitEndNode(com.oracle.graal.nodes.AbstractEndNode end) |
void |
visitFullInfopointNode(com.oracle.graal.nodes.FullInfopointNode i) |
jdk.internal.jvmci.meta.Value[] |
visitInvokeArguments(jdk.internal.jvmci.code.CallingConvention invokeCc,
Collection<com.oracle.graal.nodes.ValueNode> arguments) |
void |
visitLoopEnd(com.oracle.graal.nodes.LoopEndNode x)
Runtime specific classes can override this to insert a safepoint at the end of a loop.
|
void |
visitMerge(com.oracle.graal.nodes.AbstractMergeNode x) |
void |
visitSimpleInfopointNode(com.oracle.graal.nodes.SimpleInfopointNode i) |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
private final com.oracle.graal.graph.NodeMap<jdk.internal.jvmci.meta.Value> nodeOperands
private final DebugInfoBuilder debugInfoBuilder
protected final com.oracle.graal.lir.gen.LIRGeneratorTool gen
private com.oracle.graal.nodes.ValueNode currentInstruction
private com.oracle.graal.nodes.ValueNode lastInstructionPrinted
private Map<Class<? extends com.oracle.graal.graph.Node>,List<MatchStatement>> matchRules
public NodeLIRBuilder(com.oracle.graal.nodes.StructuredGraph graph, com.oracle.graal.lir.gen.LIRGeneratorTool gen)
protected DebugInfoBuilder createDebugInfoBuilder(com.oracle.graal.nodes.StructuredGraph graph, com.oracle.graal.nodes.spi.NodeValueMap nodeValueMap)
public jdk.internal.jvmci.meta.Value operand(com.oracle.graal.graph.Node node)
setResult(ValueNode, Value)
with the result of an instruction. It's a code
generation error to ask for the operand of ValueNode that doesn't have one yet.operand
in interface com.oracle.graal.nodes.spi.NodeValueMap
node
- A node that produces a result value.public boolean hasOperand(com.oracle.graal.graph.Node node)
hasOperand
in interface com.oracle.graal.nodes.spi.NodeValueMap
private jdk.internal.jvmci.meta.Value getOperand(com.oracle.graal.graph.Node node)
public com.oracle.graal.nodes.ValueNode valueForOperand(jdk.internal.jvmci.meta.Value value)
valueForOperand
in interface com.oracle.graal.nodes.spi.NodeValueMap
public Object getSourceForOperand(jdk.internal.jvmci.meta.Value value)
getSourceForOperand
in interface com.oracle.graal.lir.debug.LIRGenerationDebugContext
public jdk.internal.jvmci.meta.Value setResult(com.oracle.graal.nodes.ValueNode x, jdk.internal.jvmci.meta.Value operand)
setResult
in interface com.oracle.graal.nodes.spi.NodeValueMap
public void setMatchResult(com.oracle.graal.graph.Node x, jdk.internal.jvmci.meta.Value operand)
MatchStatement
machinery to override the generation LIR for some
ValueNodes.public com.oracle.graal.lir.LabelRef getLIRBlock(com.oracle.graal.nodes.FixedNode b)
public final void append(com.oracle.graal.lir.LIRInstruction op)
protected jdk.internal.jvmci.meta.LIRKind getExactPhiKind(com.oracle.graal.nodes.PhiNode phi)
private static boolean verifyPHIKind(jdk.internal.jvmci.meta.LIRKind derivedKind, jdk.internal.jvmci.meta.LIRKind phiKind)
private static boolean isPhiInputFromBackedge(com.oracle.graal.nodes.PhiNode phi, int index)
private jdk.internal.jvmci.meta.Value[] createPhiIn(com.oracle.graal.nodes.AbstractMergeNode merge)
private jdk.internal.jvmci.meta.Value[] createPhiOut(com.oracle.graal.nodes.AbstractMergeNode merge, com.oracle.graal.nodes.AbstractEndNode pred)
public void doBlock(com.oracle.graal.nodes.cfg.Block block, com.oracle.graal.nodes.StructuredGraph graph, com.oracle.graal.compiler.common.cfg.BlockMap<List<com.oracle.graal.graph.Node>> blockMap)
doBlock
in interface com.oracle.graal.nodes.spi.NodeLIRBuilderTool
protected void matchComplexExpressions(List<com.oracle.graal.graph.Node> nodes)
protected abstract boolean peephole(com.oracle.graal.nodes.ValueNode valueNode)
private void doRoot(com.oracle.graal.nodes.ValueNode instr)
protected void emitNode(com.oracle.graal.nodes.ValueNode node)
protected void emitPrologue(com.oracle.graal.nodes.StructuredGraph graph)
public void visitMerge(com.oracle.graal.nodes.AbstractMergeNode x)
visitMerge
in interface com.oracle.graal.nodes.spi.NodeLIRBuilderTool
public void visitEndNode(com.oracle.graal.nodes.AbstractEndNode end)
visitEndNode
in interface com.oracle.graal.nodes.spi.NodeLIRBuilderTool
public void visitLoopEnd(com.oracle.graal.nodes.LoopEndNode x)
visitLoopEnd
in interface com.oracle.graal.nodes.spi.NodeLIRBuilderTool
private void moveToPhi(com.oracle.graal.nodes.AbstractMergeNode merge, com.oracle.graal.nodes.AbstractEndNode pred)
protected com.oracle.graal.lir.StandardOp.JumpOp newJumpOp(com.oracle.graal.lir.LabelRef ref)
protected jdk.internal.jvmci.meta.LIRKind getPhiKind(com.oracle.graal.nodes.PhiNode phi)
private jdk.internal.jvmci.meta.Value operandForPhi(com.oracle.graal.nodes.ValuePhiNode phi)
public void emitIf(com.oracle.graal.nodes.IfNode x)
emitIf
in interface com.oracle.graal.nodes.spi.NodeLIRBuilderTool
public void emitBranch(com.oracle.graal.nodes.LogicNode node, com.oracle.graal.lir.LabelRef trueSuccessor, com.oracle.graal.lir.LabelRef falseSuccessor, double trueSuccessorProbability)
private void emitNullCheckBranch(com.oracle.graal.nodes.calc.IsNullNode node, com.oracle.graal.lir.LabelRef trueSuccessor, com.oracle.graal.lir.LabelRef falseSuccessor, double trueSuccessorProbability)
public void emitCompareBranch(com.oracle.graal.nodes.calc.CompareNode compare, com.oracle.graal.lir.LabelRef trueSuccessor, com.oracle.graal.lir.LabelRef falseSuccessor, double trueSuccessorProbability)
public void emitIntegerTestBranch(com.oracle.graal.nodes.calc.IntegerTestNode test, com.oracle.graal.lir.LabelRef trueSuccessor, com.oracle.graal.lir.LabelRef falseSuccessor, double trueSuccessorProbability)
public void emitConstantBranch(boolean value, com.oracle.graal.lir.LabelRef trueSuccessorBlock, com.oracle.graal.lir.LabelRef falseSuccessorBlock)
public void emitConditional(com.oracle.graal.nodes.calc.ConditionalNode conditional)
emitConditional
in interface com.oracle.graal.nodes.spi.NodeLIRBuilderTool
public com.oracle.graal.lir.Variable emitConditional(com.oracle.graal.nodes.LogicNode node, jdk.internal.jvmci.meta.Value trueValue, jdk.internal.jvmci.meta.Value falseValue)
public void emitInvoke(com.oracle.graal.nodes.Invoke x)
emitInvoke
in interface com.oracle.graal.nodes.spi.NodeLIRBuilderTool
protected abstract void emitDirectCall(com.oracle.graal.nodes.DirectCallTargetNode callTarget, jdk.internal.jvmci.meta.Value result, jdk.internal.jvmci.meta.Value[] parameters, jdk.internal.jvmci.meta.Value[] temps, com.oracle.graal.lir.LIRFrameState callState)
protected abstract void emitIndirectCall(com.oracle.graal.nodes.IndirectCallTargetNode callTarget, jdk.internal.jvmci.meta.Value result, jdk.internal.jvmci.meta.Value[] parameters, jdk.internal.jvmci.meta.Value[] temps, com.oracle.graal.lir.LIRFrameState callState)
public jdk.internal.jvmci.meta.Value[] visitInvokeArguments(jdk.internal.jvmci.code.CallingConvention invokeCc, Collection<com.oracle.graal.nodes.ValueNode> arguments)
visitInvokeArguments
in interface com.oracle.graal.nodes.spi.NodeLIRBuilderTool
public void emitSwitch(com.oracle.graal.nodes.extended.SwitchNode x)
emitSwitch
in interface com.oracle.graal.nodes.spi.NodeLIRBuilderTool
public DebugInfoBuilder getDebugInfoBuilder()
private static com.oracle.graal.nodes.FrameState getFrameState(com.oracle.graal.nodes.DeoptimizingNode deopt)
public com.oracle.graal.lir.LIRFrameState state(com.oracle.graal.nodes.DeoptimizingNode deopt)
state
in interface com.oracle.graal.nodes.spi.NodeLIRBuilderTool
public com.oracle.graal.lir.LIRFrameState stateWithExceptionEdge(com.oracle.graal.nodes.DeoptimizingNode deopt, com.oracle.graal.lir.LabelRef exceptionEdge)
public com.oracle.graal.lir.LIRFrameState stateFor(com.oracle.graal.nodes.FrameState state)
public com.oracle.graal.lir.LIRFrameState stateForWithExceptionEdge(com.oracle.graal.nodes.FrameState state, com.oracle.graal.lir.LabelRef exceptionEdge)
public void emitOverflowCheckBranch(com.oracle.graal.nodes.AbstractBeginNode overflowSuccessor, com.oracle.graal.nodes.AbstractBeginNode next, com.oracle.graal.compiler.common.type.Stamp stamp, double probability)
emitOverflowCheckBranch
in interface com.oracle.graal.nodes.spi.NodeLIRBuilderTool
public void visitFullInfopointNode(com.oracle.graal.nodes.FullInfopointNode i)
visitFullInfopointNode
in interface com.oracle.graal.nodes.spi.NodeLIRBuilderTool
public void visitSimpleInfopointNode(com.oracle.graal.nodes.SimpleInfopointNode i)
visitSimpleInfopointNode
in interface com.oracle.graal.nodes.spi.NodeLIRBuilderTool
public com.oracle.graal.lir.gen.LIRGeneratorTool getLIRGeneratorTool()
getLIRGeneratorTool
in interface com.oracle.graal.nodes.spi.NodeLIRBuilderTool