
    X-Phk                        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Z G 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                b   i }i }| j         D ]}d||<   | j        D ]Q}|j        D ]E}t          |t                    r|                    |j        d          }|dz   ||j        <   |dk    rNt          |j        j        |j	        j                  r*t          |j	        t                    s|j	        ||j        <   |dk    r|                    |j        d           t          |t                    r&d||j        <   |                    |j        d           t          |t                    r?t          |j	        t                    r%d||j	        <   |                    |j	        d           GSt          |                                          D ]Y\  }}	|                    |	d          dk    r||= n-|	|v r)||	         }	|                    |	d          dk    r||= |	|v )||v r|	||<   Zt#          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	transforms               `/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/mypyc/transform/copy_propagation.pydo_copy_propagationr-      sb     "F')L{  s 0 0) 	0 	0B"f%% 0JJrw**"#a%rw FF$RW\26;?? &rv~>>  -/FL))!VV $$RWa000B,, 	0"#rw  !,,,,B,, 0 bfh// 0%&F26N $$RVQ///1	06 ++--.. $ $S::c1!!S!!%%"3'::c1%%))$S)	 %%
 , #Lg..G(,??Iry)))BIII    c                  (     e Zd Zd fdZddZ xZS )r!   r*   r   mapdict[Value, Value]r   r   c                    t                                          |           | j                            |           t	          |          | _        d S N)super__init__op_mapupdatesetremoved)selfr*   r0   	__class__s      r,   r5   z!CopyPropagationTransform.__init__V   sB    !!!33xxr.   r'   r   Value | Nonec                L    |j         | j        v rd S |                     |          S r3   )r   r9   add)r:   r'   s     r,   visit_assignz%CopyPropagationTransform.visit_assign[   s&    7dl""4xx||r.   )r*   r   r0   r1   r   r   )r'   r   r   r<   )__name__
__module____qualname__r5   r?   __classcell__)r;   s   @r,   r!   r!   U   sQ                   
       r.   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,   <module>rM      s     # " " " " " # # # # # # Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z 6 6 6 6 6 6 ) ) ) ) ) ) ' ' ' ' ' ' 4 4 4 4 4 49 9 9 9x	 	 	 	 	{ 	 	 	 	 	r.   