Theory IRNodeHierarchy
subsection ‹IR Graph Node Hierarchy›
theory IRNodeHierarchy
imports IRNodes
begin
text ‹
It is helpful to introduce a node hierarchy into our formalization.
Often the GraalVM compiler relies on explicit type checks to determine
which operations to perform on a given node, we try to mimic the same
functionality by using a suite of predicate functions over the IRNode
class to determine inheritance.
As one would expect, the function is<ClassName>Type will be true if
the node parameter is a subclass of the ClassName within the GraalVM compiler.
These functions have been automatically generated from the compiler.
›
fun is_EndNode :: "IRNode ⇒ bool" where
"is_EndNode EndNode = True" |
"is_EndNode _ = False"
fun is_VirtualState :: "IRNode ⇒ bool" where
"is_VirtualState n = ((is_FrameState n))"
fun is_BinaryArithmeticNode :: "IRNode ⇒ bool" where
"is_BinaryArithmeticNode n = ((is_AddNode n) ∨ (is_AndNode n) ∨ (is_MulNode n) ∨ (is_OrNode n) ∨ (is_SubNode n) ∨ (is_XorNode n) ∨ (is_IntegerNormalizeCompareNode n) ∨ (is_IntegerMulHighNode n))"
fun is_ShiftNode :: "IRNode ⇒ bool" where
"is_ShiftNode n = ((is_LeftShiftNode n) ∨ (is_RightShiftNode n) ∨ (is_UnsignedRightShiftNode n))"
fun is_BinaryNode :: "IRNode ⇒ bool" where
"is_BinaryNode n = ((is_BinaryArithmeticNode n) ∨ (is_ShiftNode n))"
fun is_AbstractLocalNode :: "IRNode ⇒ bool" where
"is_AbstractLocalNode n = ((is_ParameterNode n))"
fun is_IntegerConvertNode :: "IRNode ⇒ bool" where
"is_IntegerConvertNode n = ((is_NarrowNode n) ∨ (is_SignExtendNode n) ∨ (is_ZeroExtendNode n))"
fun is_UnaryArithmeticNode :: "IRNode ⇒ bool" where
"is_UnaryArithmeticNode n = ((is_AbsNode n) ∨ (is_NegateNode n) ∨ (is_NotNode n) ∨ (is_BitCountNode n) ∨ (is_ReverseBytesNode n))"
fun is_UnaryNode :: "IRNode ⇒ bool" where
"is_UnaryNode n = ((is_IntegerConvertNode n) ∨ (is_UnaryArithmeticNode n))"
fun is_PhiNode :: "IRNode ⇒ bool" where
"is_PhiNode n = ((is_ValuePhiNode n))"
fun is_FloatingGuardedNode :: "IRNode ⇒ bool" where
"is_FloatingGuardedNode n = ((is_PiNode n))"
fun is_UnaryOpLogicNode :: "IRNode ⇒ bool" where
"is_UnaryOpLogicNode n = ((is_IsNullNode n))"
fun is_IntegerLowerThanNode :: "IRNode ⇒ bool" where
"is_IntegerLowerThanNode n = ((is_IntegerBelowNode n) ∨ (is_IntegerLessThanNode n))"
fun is_CompareNode :: "IRNode ⇒ bool" where
"is_CompareNode n = ((is_IntegerEqualsNode n) ∨ (is_IntegerLowerThanNode n))"
fun is_BinaryOpLogicNode :: "IRNode ⇒ bool" where
"is_BinaryOpLogicNode n = ((is_CompareNode n) ∨ (is_IntegerTestNode n))"
fun is_LogicNode :: "IRNode ⇒ bool" where
"is_LogicNode n = ((is_BinaryOpLogicNode n) ∨ (is_LogicNegationNode n) ∨ (is_ShortCircuitOrNode n) ∨ (is_UnaryOpLogicNode n))"
fun is_ProxyNode :: "IRNode ⇒ bool" where
"is_ProxyNode n = ((is_ValueProxyNode n))"
fun is_FloatingNode :: "IRNode ⇒ bool" where
"is_FloatingNode n = ((is_AbstractLocalNode n) ∨ (is_BinaryNode n) ∨ (is_ConditionalNode n) ∨ (is_ConstantNode n) ∨ (is_FloatingGuardedNode n) ∨ (is_LogicNode n) ∨ (is_PhiNode n) ∨ (is_ProxyNode n) ∨ (is_UnaryNode n))"
fun is_AccessFieldNode :: "IRNode ⇒ bool" where
"is_AccessFieldNode n = ((is_LoadFieldNode n) ∨ (is_StoreFieldNode n))"
fun is_AbstractNewArrayNode :: "IRNode ⇒ bool" where
"is_AbstractNewArrayNode n = ((is_DynamicNewArrayNode n) ∨ (is_NewArrayNode n))"
fun is_AbstractNewObjectNode :: "IRNode ⇒ bool" where
"is_AbstractNewObjectNode n = ((is_AbstractNewArrayNode n) ∨ (is_NewInstanceNode n))"
fun is_AbstractFixedGuardNode :: "IRNode ⇒ bool" where
"is_AbstractFixedGuardNode n = (is_FixedGuardNode n)"
fun is_IntegerDivRemNode :: "IRNode ⇒ bool" where
"is_IntegerDivRemNode n = ((is_SignedDivNode n) ∨ (is_SignedRemNode n))"
fun is_FixedBinaryNode :: "IRNode ⇒ bool" where
"is_FixedBinaryNode n = (is_IntegerDivRemNode n)"
fun is_DeoptimizingFixedWithNextNode :: "IRNode ⇒ bool" where
"is_DeoptimizingFixedWithNextNode n = ((is_AbstractNewObjectNode n) ∨ (is_FixedBinaryNode n) ∨ (is_AbstractFixedGuardNode n))"
fun is_AbstractMemoryCheckpoint :: "IRNode ⇒ bool" where
"is_AbstractMemoryCheckpoint n = ((is_BytecodeExceptionNode n) ∨ (is_InvokeNode n))"
fun is_AbstractStateSplit :: "IRNode ⇒ bool" where
"is_AbstractStateSplit n = ((is_AbstractMemoryCheckpoint n))"
fun is_AbstractMergeNode :: "IRNode ⇒ bool" where
"is_AbstractMergeNode n = ((is_LoopBeginNode n) ∨ (is_MergeNode n))"
fun is_BeginStateSplitNode :: "IRNode ⇒ bool" where
"is_BeginStateSplitNode n = ((is_AbstractMergeNode n) ∨ (is_ExceptionObjectNode n) ∨ (is_LoopExitNode n) ∨ (is_StartNode n))"
fun is_AbstractBeginNode :: "IRNode ⇒ bool" where
"is_AbstractBeginNode n = ((is_BeginNode n) ∨ (is_BeginStateSplitNode n) ∨ (is_KillingBeginNode n))"
fun is_AccessArrayNode :: "IRNode ⇒ bool" where
"is_AccessArrayNode n = ((is_LoadIndexedNode n) ∨ (is_StoreIndexedNode n))"
fun is_FixedWithNextNode :: "IRNode ⇒ bool" where
"is_FixedWithNextNode n = ((is_AbstractBeginNode n) ∨ (is_AbstractStateSplit n) ∨ (is_AccessFieldNode n) ∨ (is_DeoptimizingFixedWithNextNode n) ∨ (is_ControlFlowAnchorNode n) ∨ (is_ArrayLengthNode n) ∨ (is_AccessArrayNode n))"
fun is_WithExceptionNode :: "IRNode ⇒ bool" where
"is_WithExceptionNode n = ((is_InvokeWithExceptionNode n))"
fun is_ControlSplitNode :: "IRNode ⇒ bool" where
"is_ControlSplitNode n = ((is_IfNode n) ∨ (is_WithExceptionNode n))"
fun is_ControlSinkNode :: "IRNode ⇒ bool" where
"is_ControlSinkNode n = ((is_ReturnNode n) ∨ (is_UnwindNode n))"
fun is_AbstractEndNode :: "IRNode ⇒ bool" where
"is_AbstractEndNode n = ((is_EndNode n) ∨ (is_LoopEndNode n))"
fun is_FixedNode :: "IRNode ⇒ bool" where
"is_FixedNode n = ((is_AbstractEndNode n) ∨ (is_ControlSinkNode n) ∨ (is_ControlSplitNode n) ∨ (is_FixedWithNextNode n))"
fun is_CallTargetNode :: "IRNode ⇒ bool" where
"is_CallTargetNode n = ((is_MethodCallTargetNode n))"
fun is_ValueNode :: "IRNode ⇒ bool" where
"is_ValueNode n = ((is_CallTargetNode n) ∨ (is_FixedNode n) ∨ (is_FloatingNode n))"
fun is_Node :: "IRNode ⇒ bool" where
"is_Node n = ((is_ValueNode n) ∨ (is_VirtualState n))"
fun is_MemoryKill :: "IRNode ⇒ bool" where
"is_MemoryKill n = ((is_AbstractMemoryCheckpoint n))"
fun is_NarrowableArithmeticNode :: "IRNode ⇒ bool" where
"is_NarrowableArithmeticNode n = ((is_AbsNode n) ∨ (is_AddNode n) ∨ (is_AndNode n) ∨ (is_MulNode n) ∨ (is_NegateNode n) ∨ (is_NotNode n) ∨ (is_OrNode n) ∨ (is_ShiftNode n) ∨ (is_SubNode n) ∨ (is_XorNode n))"
fun is_AnchoringNode :: "IRNode ⇒ bool" where
"is_AnchoringNode n = ((is_AbstractBeginNode n))"
fun is_DeoptBefore :: "IRNode ⇒ bool" where
"is_DeoptBefore n = ((is_DeoptimizingFixedWithNextNode n))"
fun is_IndirectCanonicalization :: "IRNode ⇒ bool" where
"is_IndirectCanonicalization n = ((is_LogicNode n))"
fun is_IterableNodeType :: "IRNode ⇒ bool" where
"is_IterableNodeType n = ((is_AbstractBeginNode n) ∨ (is_AbstractMergeNode n) ∨ (is_FrameState n) ∨ (is_IfNode n) ∨ (is_IntegerDivRemNode n) ∨ (is_InvokeWithExceptionNode n) ∨ (is_LoopBeginNode n) ∨ (is_LoopExitNode n) ∨ (is_MethodCallTargetNode n) ∨ (is_ParameterNode n) ∨ (is_ReturnNode n) ∨ (is_ShortCircuitOrNode n))"
fun is_Invoke :: "IRNode ⇒ bool" where
"is_Invoke n = ((is_InvokeNode n) ∨ (is_InvokeWithExceptionNode n))"
fun is_Proxy :: "IRNode ⇒ bool" where
"is_Proxy n = ((is_ProxyNode n))"
fun is_ValueProxy :: "IRNode ⇒ bool" where
"is_ValueProxy n = ((is_PiNode n) ∨ (is_ValueProxyNode n))"
fun is_ValueNodeInterface :: "IRNode ⇒ bool" where
"is_ValueNodeInterface n = ((is_ValueNode n))"
fun is_ArrayLengthProvider :: "IRNode ⇒ bool" where
"is_ArrayLengthProvider n = ((is_AbstractNewArrayNode n) ∨ (is_ConstantNode n))"
fun is_StampInverter :: "IRNode ⇒ bool" where
"is_StampInverter n = ((is_IntegerConvertNode n) ∨ (is_NegateNode n) ∨ (is_NotNode n))"
fun is_GuardingNode :: "IRNode ⇒ bool" where
"is_GuardingNode n = ((is_AbstractBeginNode n))"
fun is_SingleMemoryKill :: "IRNode ⇒ bool" where
"is_SingleMemoryKill n = ((is_BytecodeExceptionNode n) ∨ (is_ExceptionObjectNode n) ∨ (is_InvokeNode n) ∨ (is_InvokeWithExceptionNode n) ∨ (is_KillingBeginNode n) ∨ (is_StartNode n))"
fun is_LIRLowerable :: "IRNode ⇒ bool" where
"is_LIRLowerable n = ((is_AbstractBeginNode n) ∨ (is_AbstractEndNode n) ∨ (is_AbstractMergeNode n) ∨ (is_BinaryOpLogicNode n) ∨ (is_CallTargetNode n) ∨ (is_ConditionalNode n) ∨ (is_ConstantNode n) ∨ (is_IfNode n) ∨ (is_InvokeNode n) ∨ (is_InvokeWithExceptionNode n) ∨ (is_IsNullNode n) ∨ (is_LoopBeginNode n) ∨ (is_PiNode n) ∨ (is_ReturnNode n) ∨ (is_SignedDivNode n) ∨ (is_SignedRemNode n) ∨ (is_UnaryOpLogicNode n) ∨ (is_UnwindNode n))"
fun is_GuardedNode :: "IRNode ⇒ bool" where
"is_GuardedNode n = ((is_FloatingGuardedNode n))"
fun is_ArithmeticLIRLowerable :: "IRNode ⇒ bool" where
"is_ArithmeticLIRLowerable n = ((is_AbsNode n) ∨ (is_BinaryArithmeticNode n) ∨ (is_IntegerConvertNode n) ∨ (is_NotNode n) ∨ (is_ShiftNode n) ∨ (is_UnaryArithmeticNode n))"
fun is_SwitchFoldable :: "IRNode ⇒ bool" where
"is_SwitchFoldable n = ((is_IfNode n))"
fun is_VirtualizableAllocation :: "IRNode ⇒ bool" where
"is_VirtualizableAllocation n = ((is_NewArrayNode n) ∨ (is_NewInstanceNode n))"
fun is_Unary :: "IRNode ⇒ bool" where
"is_Unary n = ((is_LoadFieldNode n) ∨ (is_LogicNegationNode n) ∨ (is_UnaryNode n) ∨ (is_UnaryOpLogicNode n))"
fun is_FixedNodeInterface :: "IRNode ⇒ bool" where
"is_FixedNodeInterface n = ((is_FixedNode n))"
fun is_BinaryCommutative :: "IRNode ⇒ bool" where
"is_BinaryCommutative n = ((is_AddNode n) ∨ (is_AndNode n) ∨ (is_IntegerEqualsNode n) ∨ (is_MulNode n) ∨ (is_OrNode n) ∨ (is_XorNode n))"
fun is_Canonicalizable :: "IRNode ⇒ bool" where
"is_Canonicalizable n = ((is_BytecodeExceptionNode n) ∨ (is_ConditionalNode n) ∨ (is_DynamicNewArrayNode n) ∨ (is_PhiNode n) ∨ (is_PiNode n) ∨ (is_ProxyNode n) ∨ (is_StoreFieldNode n) ∨ (is_ValueProxyNode n))"
fun is_UncheckedInterfaceProvider :: "IRNode ⇒ bool" where
"is_UncheckedInterfaceProvider n = ((is_InvokeNode n) ∨ (is_InvokeWithExceptionNode n) ∨ (is_LoadFieldNode n) ∨ (is_ParameterNode n))"
fun is_Binary :: "IRNode ⇒ bool" where
"is_Binary n = ((is_BinaryArithmeticNode n) ∨ (is_BinaryNode n) ∨ (is_BinaryOpLogicNode n) ∨ (is_CompareNode n) ∨ (is_FixedBinaryNode n) ∨ (is_ShortCircuitOrNode n))"
fun is_ArithmeticOperation :: "IRNode ⇒ bool" where
"is_ArithmeticOperation n = ((is_BinaryArithmeticNode n) ∨ (is_IntegerConvertNode n) ∨ (is_ShiftNode n) ∨ (is_UnaryArithmeticNode n))"
fun is_ValueNumberable :: "IRNode ⇒ bool" where
"is_ValueNumberable n = ((is_FloatingNode n) ∨ (is_ProxyNode n))"
fun is_Lowerable :: "IRNode ⇒ bool" where
"is_Lowerable n = ((is_AbstractNewObjectNode n) ∨ (is_AccessFieldNode n) ∨ (is_BytecodeExceptionNode n) ∨ (is_ExceptionObjectNode n) ∨ (is_IntegerDivRemNode n) ∨ (is_UnwindNode n))"
fun is_Virtualizable :: "IRNode ⇒ bool" where
"is_Virtualizable n = ((is_IsNullNode n) ∨ (is_LoadFieldNode n) ∨ (is_PiNode n) ∨ (is_StoreFieldNode n) ∨ (is_ValueProxyNode n))"
fun is_Simplifiable :: "IRNode ⇒ bool" where
"is_Simplifiable n = ((is_AbstractMergeNode n) ∨ (is_BeginNode n) ∨ (is_IfNode n) ∨ (is_LoopExitNode n) ∨ (is_MethodCallTargetNode n) ∨ (is_NewArrayNode n))"
fun is_StateSplit :: "IRNode ⇒ bool" where
"is_StateSplit n = ((is_AbstractStateSplit n) ∨ (is_BeginStateSplitNode n) ∨ (is_StoreFieldNode n))"
fun is_ConvertNode :: "IRNode ⇒ bool" where
"is_ConvertNode n = ((is_IntegerConvertNode n))"
fun is_sequential_node :: "IRNode ⇒ bool" where
"is_sequential_node (StartNode _ _) = True" |
"is_sequential_node (BeginNode _) = True" |
"is_sequential_node (KillingBeginNode _) = True" |
"is_sequential_node (LoopBeginNode _ _ _ _) = True" |
"is_sequential_node (LoopExitNode _ _ _) = True" |
"is_sequential_node (MergeNode _ _ _) = True" |
"is_sequential_node (RefNode _) = True" |
"is_sequential_node (ControlFlowAnchorNode _) = True" |
"is_sequential_node _ = False"
text ‹
The following convenience function is useful in determining if
two IRNodes are of the same type irregardless of their edges.
It will return true if both the node parameters are the same node class.
›
fun is_same_ir_node_type :: "IRNode ⇒ IRNode ⇒ bool" where
"is_same_ir_node_type n1 n2 = (
((is_AbsNode n1) ∧ (is_AbsNode n2)) ∨
((is_AddNode n1) ∧ (is_AddNode n2)) ∨
((is_AndNode n1) ∧ (is_AndNode n2)) ∨
((is_BeginNode n1) ∧ (is_BeginNode n2)) ∨
((is_BytecodeExceptionNode n1) ∧ (is_BytecodeExceptionNode n2)) ∨
((is_ConditionalNode n1) ∧ (is_ConditionalNode n2)) ∨
((is_ConstantNode n1) ∧ (is_ConstantNode n2)) ∨
((is_DynamicNewArrayNode n1) ∧ (is_DynamicNewArrayNode n2)) ∨
((is_EndNode n1) ∧ (is_EndNode n2)) ∨
((is_ExceptionObjectNode n1) ∧ (is_ExceptionObjectNode n2)) ∨
((is_FrameState n1) ∧ (is_FrameState n2)) ∨
((is_IfNode n1) ∧ (is_IfNode n2)) ∨
((is_IntegerBelowNode n1) ∧ (is_IntegerBelowNode n2)) ∨
((is_IntegerEqualsNode n1) ∧ (is_IntegerEqualsNode n2)) ∨
((is_IntegerLessThanNode n1) ∧ (is_IntegerLessThanNode n2)) ∨
((is_InvokeNode n1) ∧ (is_InvokeNode n2)) ∨
((is_InvokeWithExceptionNode n1) ∧ (is_InvokeWithExceptionNode n2)) ∨
((is_IsNullNode n1) ∧ (is_IsNullNode n2)) ∨
((is_KillingBeginNode n1) ∧ (is_KillingBeginNode n2)) ∨
((is_LeftShiftNode n1) ∧ (is_LeftShiftNode n2)) ∨
((is_LoadFieldNode n1) ∧ (is_LoadFieldNode n2)) ∨
((is_LogicNegationNode n1) ∧ (is_LogicNegationNode n2)) ∨
((is_LoopBeginNode n1) ∧ (is_LoopBeginNode n2)) ∨
((is_LoopEndNode n1) ∧ (is_LoopEndNode n2)) ∨
((is_LoopExitNode n1) ∧ (is_LoopExitNode n2)) ∨
((is_MergeNode n1) ∧ (is_MergeNode n2)) ∨
((is_MethodCallTargetNode n1) ∧ (is_MethodCallTargetNode n2)) ∨
((is_MulNode n1) ∧ (is_MulNode n2)) ∨
((is_NarrowNode n1) ∧ (is_NarrowNode n2)) ∨
((is_NegateNode n1) ∧ (is_NegateNode n2)) ∨
((is_NewArrayNode n1) ∧ (is_NewArrayNode n2)) ∨
((is_NewInstanceNode n1) ∧ (is_NewInstanceNode n2)) ∨
((is_NotNode n1) ∧ (is_NotNode n2)) ∨
((is_OrNode n1) ∧ (is_OrNode n2)) ∨
((is_ParameterNode n1) ∧ (is_ParameterNode n2)) ∨
((is_PiNode n1) ∧ (is_PiNode n2)) ∨
((is_ReturnNode n1) ∧ (is_ReturnNode n2)) ∨
((is_RightShiftNode n1) ∧ (is_RightShiftNode n2)) ∨
((is_ShortCircuitOrNode n1) ∧ (is_ShortCircuitOrNode n2)) ∨
((is_SignedDivNode n1) ∧ (is_SignedDivNode n2)) ∨
((is_SignedFloatingIntegerDivNode n1) ∧ (is_SignedFloatingIntegerDivNode n2)) ∨
((is_SignedFloatingIntegerRemNode n1) ∧ (is_SignedFloatingIntegerRemNode n2)) ∨
((is_SignedRemNode n1) ∧ (is_SignedRemNode n2)) ∨
((is_SignExtendNode n1) ∧ (is_SignExtendNode n2)) ∨
((is_StartNode n1) ∧ (is_StartNode n2)) ∨
((is_StoreFieldNode n1) ∧ (is_StoreFieldNode n2)) ∨
((is_SubNode n1) ∧ (is_SubNode n2)) ∨
((is_UnsignedRightShiftNode n1) ∧ (is_UnsignedRightShiftNode n2)) ∨
((is_UnwindNode n1) ∧ (is_UnwindNode n2)) ∨
((is_ValuePhiNode n1) ∧ (is_ValuePhiNode n2)) ∨
((is_ValueProxyNode n1) ∧ (is_ValueProxyNode n2)) ∨
((is_XorNode n1) ∧ (is_XorNode n2)) ∨
((is_ZeroExtendNode n1) ∧ (is_ZeroExtendNode n2)))"
end