public abstract class FloatingIntegerDivRemNode<OP> extends BinaryArithmeticNode<OP> implements IterableNodeType, GuardedNode, Lowerable
FloatingNode version of IntegerDivRemNode if it is known that this node cannot
trap nor overflow (if these concepts exist with respect to the target architecture's division
operation). We distinguish between two reasons to trap: a division by zero or an overflow of
MIN_VALUE/-1. The division by 0 is typically checked with a zeroGuard. The knowledge about the
dividend containing MIN_VALUE is either guaranteed by its stamp or externally injected by a
guard.Node.ConstantNodeParameter, Node.EdgeVisitor, Node.IndirectCanonicalization, Node.InjectedNodeParameter, Node.Input, Node.NodeInsertionStackTrace, Node.NodeIntrinsic, Node.NodeIntrinsicFactory, Node.OptionalInput, Node.Successor, Node.ValueNumberableCanonicalizable.Binary<T extends Node>, Canonicalizable.BinaryCommutative<T extends Node>, Canonicalizable.Ternary<T extends Node>, Canonicalizable.Unary<T extends Node>| Modifier and Type | Field and Description |
|---|---|
protected GuardingNode |
floatingGuard |
static NodeClass<FloatingIntegerDivRemNode> |
TYPE |
x, yEMPTY_ARRAY, stampNODE_LIST, NOT_ITERABLE, TRACK_CREATION_POSITION, WithAllEdges, WithNoEdges, WithOnlyInputEdges, WithOnlySucessorEdges| Modifier | Constructor and Description |
|---|---|
protected |
FloatingIntegerDivRemNode(NodeClass<? extends FloatingIntegerDivRemNode<OP>> c,
ArithmeticOpTable.BinaryOp<OP> op,
ValueNode x,
ValueNode y,
GuardingNode floatingGuard)
Construct a new FloatingIntegerDivRemNode.
|
protected |
FloatingIntegerDivRemNode(NodeClass<? extends FloatingIntegerDivRemNode<OP>> c,
ArithmeticOpTable.BinaryOp<OP> op,
ValueNode x,
ValueNode y,
GuardingNode floatingGuard,
boolean divisionOverflowIsJVMSCompliant) |
| Modifier and Type | Method and Description |
|---|---|
protected boolean |
canDivideByZero()
Determine if the division operation can potentially be a division by zero, i.e., the divisor
stamp can contain the value
0. |
boolean |
divisionOverflowIsJVMSCompliant() |
GuardingNode |
getGuard() |
void |
setDivisionOverflowIsJVMSCompliant() |
void |
setGuard(GuardingNode guard) |
boolean |
verify() |
add, add, add, branchlessMax, branchlessMin, canonical, foldStamp, getArithmeticOp, getArithmeticOpTable, getOp, getOp, isAssociative, maybeCommuteInputs, mul, mul, mul, reassociateMatchedValues, reassociateUnmatchedValues, shouldSwapInputs, sub, sub, sub, tryConstantFoldgetX, getY, inferStamp, setX, setYasConstant, asJavaConstant, asNode, asSerializableConstant, checkReplaceAtUsagesInvariants, getStackKind, graph, hasUsagesOtherThan, isAllowedUsageType, isConstant, isConstantPredicate, isDefaultConstant, isIllegalConstant, isJavaConstant, isNullConstant, isSerializableConstant, recursivelyDataFlowEqualsUpTo, setStamp, stamp, updateStamp, updateUsagesInterfaceafterClone, applyInputs, applySuccessors, assertFalse, assertTrue, cfgPredecessors, cfgSuccessors, clearInputs, clearNodeSourcePosition, clearSuccessors, copyWithInputs, copyWithInputs, dataFlowEquals, dynamicNodeSizeEstimate, estimatedNodeCycles, estimatedNodeSize, fail, formatTo, getCreationPosition, getDebug, getDebugProperties, getDebugProperties, getInsertionPosition, getNodeClass, getNodeSourcePosition, getOptions, getUsageCount, hasExactlyOneUsage, hashCode, hasMoreThanOneUsage, hasNoUsages, hasOnlyUsagesOfType, hasUsages, hasUsagesOfType, inputPositions, inputs, isAlive, isDeleted, isUnregistered, markDeleted, maybeNotifyZeroUsages, modCount, predecessor, pushInputs, removeUsage, replaceAllInputs, replaceAndDelete, replaceAtAllUsages, replaceAtMatchingUsages, replaceAtPredecessor, replaceAtUsages, replaceAtUsages, replaceAtUsages, replaceAtUsages, replaceAtUsages, replaceAtUsagesAndDelete, replaceAtUsagesAndDelete, replaceFirstInput, replaceFirstSuccessor, safeDelete, setCreationPosition, setInsertionPosition, setNodeSourcePosition, singleUsage, successorPositions, successors, toString, toString, updateNodeSourcePosition, updatePredecessor, updateUsages, usages, valueEquals, verifyEdges, verifyInputs, verifySourcePosition, withNodeSourcePositionclone, equals, getClass, notify, notifyAll, wait, wait, waitasNodegenerate, generatecanonical, getX, getYpublic static final NodeClass<FloatingIntegerDivRemNode> TYPE
protected GuardingNode floatingGuard
protected FloatingIntegerDivRemNode(NodeClass<? extends FloatingIntegerDivRemNode<OP>> c, ArithmeticOpTable.BinaryOp<OP> op, ValueNode x, ValueNode y, GuardingNode floatingGuard)
c - the concrete subclass for this nodeop - the division operation of this nodex - the dividendy - the divisorfloatingGuard - the guard (potentially a MultiGuardNode) that represents all
necessary pre-conditions to allow a floating of the previously fixed
IntegerDivRemNodeprotected FloatingIntegerDivRemNode(NodeClass<? extends FloatingIntegerDivRemNode<OP>> c, ArithmeticOpTable.BinaryOp<OP> op, ValueNode x, ValueNode y, GuardingNode floatingGuard, boolean divisionOverflowIsJVMSCompliant)
public GuardingNode getGuard()
getGuard in interface GuardedNodepublic void setDivisionOverflowIsJVMSCompliant()
public boolean divisionOverflowIsJVMSCompliant()
public void setGuard(GuardingNode guard)
setGuard in interface GuardedNodeprotected boolean canDivideByZero()
0.