15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)cimport cython
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from Cython.Compiler.Visitor cimport CythonTransform, TreeVisitor
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)cdef class ControlBlock:
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cdef public set children
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cdef public set parents
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cdef public set positions
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cdef public list stats
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cdef public dict gen
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cdef public set bounded
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cdef public dict input
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cdef public dict output
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     # Big integer it bitsets
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cdef public object i_input
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cdef public object i_output
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cdef public object i_gen
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cdef public object i_kill
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cdef public object i_state
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cpdef bint empty(self)
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cpdef detach(self)
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cpdef add_child(self, block)
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)cdef class ExitBlock(ControlBlock):
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cpdef bint empty(self)
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)cdef class NameAssignment:
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    cdef public bint is_arg
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    cdef public bint is_deletion
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    cdef public object lhs
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    cdef public object rhs
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    cdef public object entry
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    cdef public object pos
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    cdef public set refs
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    cdef public object bit
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    cdef public object inferred_type
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)cdef class AssignmentList:
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    cdef public object bit
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    cdef public object mask
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    cdef public list stats
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)cdef class AssignmentCollector(TreeVisitor):
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    cdef list assignments
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)@cython.final
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)cdef class ControlFlow:
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cdef public set blocks
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cdef public set entries
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cdef public list loops
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cdef public list exceptions
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cdef public ControlBlock entry_point
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cdef public ExitBlock exit_point
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cdef public ControlBlock block
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cdef public dict assmts
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cpdef newblock(self, ControlBlock parent=*)
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cpdef nextblock(self, ControlBlock parent=*)
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cpdef bint is_tracked(self, entry)
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cpdef bint is_statically_assigned(self, entry)
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cpdef mark_position(self, node)
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cpdef mark_assignment(self, lhs, rhs, entry)
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cpdef mark_argument(self, lhs, rhs, entry)
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cpdef mark_deletion(self, node, entry)
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cpdef mark_reference(self, node, entry)
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     @cython.locals(block=ControlBlock, parent=ControlBlock, unreachable=set)
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cpdef normalize(self)
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     @cython.locals(bit=object, assmts=AssignmentList,
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    block=ControlBlock)
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cpdef initialize(self)
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     @cython.locals(assmts=AssignmentList, assmt=NameAssignment)
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cpdef set map_one(self, istate, entry)
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     @cython.locals(block=ControlBlock, parent=ControlBlock)
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     cdef reaching_definitions(self)
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)cdef class Uninitialized:
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     pass
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)cdef class Unknown:
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    pass
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)@cython.locals(dirty=bint, block=ControlBlock, parent=ControlBlock,
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               assmt=NameAssignment)
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)cdef check_definitions(ControlFlow flow, dict compiler_directives)
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)@cython.final
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)cdef class ControlFlowAnalysis(CythonTransform):
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    cdef object gv_ctx
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    cdef set reductions
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    cdef list env_stack
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    cdef list stack
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    cdef object env
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    cdef ControlFlow flow
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    cdef bint in_inplace_assignment
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    cpdef mark_assignment(self, lhs, rhs=*)
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    cpdef mark_position(self, node)
106