o
    2gk                     @  s   d Z ddlmZ ddlmZ ddlmZmZmZm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZ ddlmZ dddZG dd deZdS )zSimple copy propagation optimization.

Example input:

    x = f()
    y = x

The register x is redundant and we can directly assign its value to y:

    y = f()

This can optimize away registers that are assigned to once.
    )annotations)FuncIR)AssignAssignMultiLoadAddressLoadErrorValueRegisterValue)LowLevelIRBuilder)CompilerOptions)is_same_type)IRTransformfnr   optionsr   returnNonec                 C  s  i }i }| j D ]}d||< q| jD ]j}|jD ]d}t|trQ||jd}|d ||j< |dkrEt|jj|j	jrEt|j	t
sE|j	||j< q|dkrP||jd qt|trcd||j< ||jd qt|trzt|j	trzd||j	< ||j	d qqt| D ]/\}}	||	ddkr||= n|	|v r||	 }	||	ddkr||= |	|v s||v r|	||< qtd|}
t|
|}|| j |
j| _dS )z-Perform copy propagation optimization for fn.   r      N)arg_regsblocksops
isinstancer   getdestr   typesrcr   popr   r   r   listitemsr
   CopyPropagationTransformtransform_blocks)r   r   countsreplacementsargblockopcr   dstbuilder	transform r*   X/home/garg/my-data/venv/lib/python3.10/site-packages/mypyc/transform/copy_propagation.pydo_copy_propagation   sT   











r,   c                      s(   e Zd Zd fddZdddZ  ZS )r   r(   r
   mapdict[Value, Value]r   r   c                   s&   t  | | j| t|| _d S N)super__init__op_mapupdatesetremoved)selfr(   r-   	__class__r*   r+   r1   V   s   z!CopyPropagationTransform.__init__r%   r   Value | Nonec                 C  s   |j | jv rd S | |S r/   )r   r5   add)r6   r%   r*   r*   r+   visit_assign[   s   
z%CopyPropagationTransform.visit_assign)r(   r
   r-   r.   r   r   )r%   r   r   r9   )__name__
__module____qualname__r1   r;   __classcell__r*   r*   r7   r+   r   U   s    r   N)r   r   r   r   r   r   )__doc__
__future__r   mypyc.ir.func_irr   mypyc.ir.opsr   r   r   r   r   r	   mypyc.irbuild.ll_builderr
   mypyc.optionsr   mypyc.sametyper   mypyc.transform.ir_transformr   r,   r   r*   r*   r*   r+   <module>   s     
<