Ë
    æÿæiþ!  ã                   óÊ   — d Z 	 ddlmZ ddlmZ dZd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z G d„ d«      Zd„ Zd„ Zedk(  r e«        yy# e$ r Y ŒWw xY w)zc
Contains tests and a prototype implementation for the fanout algorithm in
the LLVM refprune pass.
é    )ÚDigraph)ÚdefaultdictÚAc                  óæ   — i ddg“dddg“dg “dddg“ddg“dg “ddd	g“d	ddg“dd
dg“d
ddg“dg “ddg“dg d¢“ddg“ddg“dg “} t        t        «      }dg|d<   dg|d<   ddg|d<   dddhi}|| |fS )Nr   ÚBÚCÚDÚEÚFÚGÚHÚIÚJÚKÚLÚMÚZ)r   ÚOÚPr   r   ÚincrefÚdecref©r   Úlist©ÚedgesÚnodesÚexpecteds      úr/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/llvmlite/tests/refprune_proto.pyÚcase1r      s2  € ðØˆcˆUðàˆc�3ˆZðð 	ˆRðð 	ˆc�3ˆZð	ð
 	ˆcˆUðð 	ˆRðð 	ˆc�3ˆZðð 	ˆc�3ˆZðð 	ˆc�3ˆZðð 	ˆc�3ˆZðð 	ˆRðð 	ˆcˆUðð 	Š_ðð 	ˆcˆUðð 	ˆcˆUðð  	ˆRð!€Eô$ œÓ€EØ�€Eˆ#�JØ�€Eˆ#�JØ˜HÐ%€Eˆ#�JØ�c˜3�ZÐ €HØ�%˜Ð!Ð!ó    c                  óh   — ddgdgg dœ} t        t        «      }dg|d<   dg|d<   dg|d<   dd i}|| |fS )Nr   r   )r   r   r   r   r   r   r   r   s      r   Úcase2r"   2   s[   € à�3ˆZØˆUØñ€Eô
 œÓ€EØ�€Eˆ#�JØ�€Eˆ#�JØ�€Eˆ#�JØ�Tˆ{€HØ�%˜Ð!Ð!r    c                  óX   — t        «       \  } }}|d   j                  d«       dd i}| ||fS )Nr   r   r	   ©r   Úappend©r   r   Ú_r   s       r   Úcase3r(   @   ó7   € Ü“g�O€Eˆ5�!à	ˆ#�J×Ñ�cÔØ�Tˆ{€HØ�%˜Ð!Ð!r    c                  óX   — t        «       \  } }}|d   j                  d«       dd i}| ||fS )Nr   r
   r	   r$   r&   s       r   Úcase4r+   H   r)   r    c                  óX   — t        «       \  } }}|d   j                  d«       dd i}| ||fS )Nr   r   r	   r$   r&   s       r   Úcase5r-   P   r)   r    c                  óX   — t        «       \  } }}|d   j                  d«       dd i}| ||fS )Nr   r   r	   r$   r&   s       r   Úcase6r/   X   r)   r    c                  óX   — t        «       \  } }}|d   j                  d«       dd i}| ||fS )Nr   r   r	   r$   r&   s       r   Úcase7r1   `   r)   r    c                  ób   — dgddgdgg dœ} t        t        «      }dg|d<   dg|d<   ddhi}|| |fS )Nr   r   r   )zentry:r   r   r   r   r   r   r   s      r   Úcase8r3   h   sW   € à�%Ø�3ˆZØˆUØñ	€Eô œÓ€EØ�€Eˆ#�JØ�€Eˆ#�JØ�c�Uˆ|€HØ�%˜Ð!Ð!r    c                  óX   — t        «       \  } }}|d   j                  d«       dd i}| ||fS )Nr   r   r   ©r3   r%   r&   s       r   Úcase9r6   v   r)   r    c                  óZ   — t        «       \  } }}|d   j                  d«       ddhi}| ||fS )Nr   r   r5   r&   s       r   Úcase10r8   ~   s9   € Ü“g�O€Eˆ5�!à	ˆ#�J×Ñ�cÔØ�c�Uˆ|€HØ�%˜Ð!Ð!r    c                  ód   — t        «       \  } }}|d   j                  d«       g |d<   ddhi}| ||fS ©Nr   r	   r   r5   r&   s       r   Úcase11r;   †   sB   € Ü“g�O€Eˆ5�!Ø	ˆ#�J×Ñ�cÔØ€Eˆ#�JØ�c�Uˆ|€HØ�%˜Ð!Ð!r    c                  óf   — t        «       \  } }}|d   j                  d«       dg|d<   ddhi}| ||fS r:   r5   r&   s       r   Úcase12r=   Ž   sD   € Ü“g�O€Eˆ5�!Ø	ˆ#�J×Ñ�cÔØ�€Eˆ#�JØ�c�Uˆ|€HØ�%˜Ð!Ð!r    c                  ód   — t        «       \  } }}|d   j                  d«       dg|d<   dd i}| ||fS )Nr   r	   r   r   r5   r&   s       r   Úcase13r?   –   sB   € Ü“g�O€Eˆ5�!Ø	ˆ#�J×Ñ�cÔØ�€Eˆ#�JØ�Tˆ{€HØ�%˜Ð!Ð!r    c                 óŠ   — t        t        «      }| j                  «       D ]   \  }}|D ]  }||   j                  |«       Œ Œ" |S ©N)r   ÚsetÚitemsÚadd)r   ÚdÚsrcÚ	outgoingsÚdsts        r   Úmake_predecessor_maprI   ž   s@   € Ü”CÓ€AØŸ+™+ž-‰ˆˆYÛˆCØˆc‰F�J‰J�s�Oñ ð (ð €Hr    c                   óT   — e Zd Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Z	 dd
„Zd„ Zy)ÚFanoutAlgorithmc                 ó~   — || _         || _        t        |«      | _        |rt        | _        y | j
                  | _        y rA   )r   r   rI   Ú	rev_edgesÚprintÚ_null_print)Úselfr   r   Úverboses       r   Ú__init__zFanoutAlgorithm.__init__§   s1   € ØˆŒ
ØˆŒ
Ü-¨eÓ4ˆŒÙ%”Uˆ�
¨4×+;Ñ+;ˆ�
r    c                 ó"   — | j                  «       S rA   )Úfind_fanout_in_function)rP   s    r   ÚrunzFanoutAlgorithm.run­   s   € Ø×+Ñ+Ó-Ð-r    c                  ó   — y rA   © )rP   ÚargsÚkwargss      r   rO   zFanoutAlgorithm._null_print°   s   € Ør    c                 ó¶   — i }| j                   D ]G  }d„ | j                  |   D «       D ],  }| j                  |«      }| j                  d|d|«       |||<   Œ. ŒI |S )Nc              3   ó,   K  — | ]  }|d k(  sŒ	|–— Œ y­w)r   NrW   )Ú.0Úxs     r   Ú	<genexpr>z:FanoutAlgorithm.find_fanout_in_function.<locals>.<genexpr>¶   s   è ø€ ÐLÑ&: ¸aÀ8»mœ1Ñ&:ùs   ‚
�z>>z===)r   r   Úfind_fanoutrN   )rP   ÚgotÚcur_noder   Údecref_blockss        r   rT   z'FanoutAlgorithm.find_fanout_in_function³   s`   € ØˆØŸ
œ
ˆHÙL d§j¡j°Ò&:ÖL�Ø $× 0Ñ 0°Ó :�Ø—
‘
˜4 ¨5°-Ô@Ø -��H’ñ Mð #ð
 ˆ
r    c                 ó–   — | j                  |«      }| j                  d|«       |sy | j                  ||t        ¬«      sy t	        |«      S )NÚ
candidates)Úentry)Úfind_decref_candidatesrN   Úverify_non_overlappingÚENTRYrB   )rP   Ú	head_noderb   s      r   r_   zFanoutAlgorithm.find_fanout¼   sP   € Ø×3Ñ3°IÓ>ˆØ�
‰
�< Ô/ÙØØ×*Ñ*Ø�}¬Eð +ô 
ð Ü�=Ó!Ð!r    c                 ó$  — | j                  dj                  dd«      «       t        |«      }|râ|j                  «       }t	        «       }|g}~|r¿|j                  «       }| j                  d|d|«       ||v rŒ+||k(  r| j                  d|«       y|j                  |«       | j                  d|› d	| j                  |«      › �«       | j                  |«      D ]0  }||v r| j                  d
«        y||k7  sŒ |j                  |«       Œ2 |rŒ¿|rŒây)Nrg   éP   Ú-ra   Ú|z%!! failed because we arrived at entryFz   z preds z.!! reject because predecessor in decref_blocksT)rN   Úcenterr   ÚpoprB   rD   Úget_predecessorsr%   )	rP   ri   rb   re   Útodora   ÚvisitedÚ	workstackÚpreds	            r   rg   z&FanoutAlgorithm.verify_non_overlappingÇ   s  € Ø�
‰
Ð+×2Ñ2°2°sÓ;Ô<ô �MÓ"ˆÙØ—x‘x“zˆHÜ“eˆGà!˜
ˆIØÙØ$Ÿ=™=›?�Ø—
‘
˜: x°°iÔ@Ø˜wÑ&ØØ˜uÒ$à—J‘JØ?Àôð !Ø—‘˜HÔ%à—
‘
Ø˜(˜ 7¨4×+@Ñ+@ÀÓ+JÐ*KÐLôð !×1Ñ1°(Ö;�DØ˜}Ñ,àŸ
™
ØLôñ  %Ø˜yÓ(à!×(Ñ(¨Õ.ð <ò! ò ðB r    c                 ó2   — t        | j                  |   «      S rA   )Útupler   ©rP   Únodes     r   Úget_successorszFanoutAlgorithm.get_successorsï   s   € Ü�T—Z‘Z Ñ%Ó&Ð&r    c                 ó2   — t        | j                  |   «      S rA   )rv   rM   rw   s     r   rp   z FanoutAlgorithm.get_predecessorsò   s   € Ü�T—^‘^ DÑ)Ó*Ð*r    c                 ó$   — d| j                   |   v S )Nr   )r   rw   s     r   Ú
has_decrefzFanoutAlgorithm.has_decrefõ   s   € Ø˜4Ÿ:™: dÑ+Ð+Ð+r    c                 ó~  — dt        |«      z  }| j                  |d||«       |dk  ry||v r
||d   k(  ryy| j                  |«      r$|j                  |«       | j                  |d«       y|dz  }||fz  }d}| j	                  |«      D ]  }| j                  |||«      sd} nd}Œ | j                  |d|› �«       |S )	NÚ Úwalkr   FTzfound decrefé   zret )ÚlenrN   r|   rD   ry   Úwalk_child_for_decref)rP   ra   Ú
path_stackrb   ÚdepthÚindentÚfoundÚchilds           r   r‚   z%FanoutAlgorithm.walk_child_for_decrefø   sá   € ð ”s˜:“Ñ&ˆØ�
‰
�6˜6 :¨xÔ8Ø�AŠ:ØØ�zÑ!Ø˜: a™=Ò(ØØØ�?‰?˜8Ô$Ø×Ñ˜hÔ'Ø�J‰J�v˜~Ô.Øà�‰
ˆØ�x�kÑ!ˆ
ØˆØ×(Ñ(¨Ö2ˆEØ×-Ñ-Ø�z =ôð �Ùà‘ð 3ð 	�
‰
�6˜T % ˜>Ô*Øˆr    c                 óÜ   — | j                  dj                  dd«      «       |f}d}t        «       }| j                  |«      D ]  }| j	                  |||«      sd} nd}Œ |s
t        «       S |S )Nrf   rk   rl   FT)rN   rn   rB   ry   r‚   )rP   ra   rƒ   r†   rb   r‡   s         r   rf   z&FanoutAlgorithm.find_decref_candidates  sz   € à�
‰
Ð+×2Ñ2°2°sÓ;Ô<Ø�[ˆ
ØˆÜ›ˆØ×(Ñ(¨Ö2ˆEØ×-Ñ-Ø�z =ôð �Ùà‘ð 3ñ Ü“5ˆLà Ð r    N)F)é
   )Ú__name__Ú
__module__Ú__qualname__rR   rU   rO   rT   r_   rg   ry   rp   r|   r‚   rf   rW   r    r   rK   rK   ¦   s?   „ ó<ò.òòò	"ò&òP'ò+ò,ð :<óó>!r    rK   c            
      óf  — t        «       \  } }}t        «       }|D ].  }|j                  |d|› d�dj                  | |   «      z   ¬«       Œ0 |j	                  «       D ]  \  }}|D ]  }|j                  ||«       Œ Œ  |j                  «        t        | |d¬«      }|j                  «       }||k(  sJ ‚y )NÚrectÚ
z\l)ÚshapeÚlabelT)rQ   )	r?   r   rx   ÚjoinrC   ÚedgeÚviewrK   rU   )	r   r   r   r   rx   Úchildrenr‡   Úalgor`   s	            r   Ú
check_oncer—   +  s©   € Ü#›XÑ€Eˆ5�(ô 	‹	€AÛˆØ	�‰ˆt˜6¨D¨6°¨°u·z±zÀ%ÈÁ+Ó7NÑ)NˆÕOð àŸ+™+ž-‰ˆˆhÛˆEØ�F‰F�4˜Õñ ð (ð ‡F�F„Hä˜5 %°Ô6€DØ
�(‰(‹*€CØ�sŠ?Ð‰?r    c                  ó$  — t        t        «       j                  «       «      D ]a  \  } }| j                  d«      sŒt	        |› j                  dd«      «        |«       \  }}}t        ||«      }|j                  «       }||k(  rŒaJ ‚ t	        d«       y )NÚcaserk   rl   z
ALL PASSED)r   ÚglobalsrC   Ú
startswithrN   rn   rK   rU   )ÚkÚfnr   r   r   r–   r`   s          r   Ú	check_allrž   =  sz   € Ü”g“i—o‘oÓ'Ö(‰ˆˆ2Ø�<‰<˜ÕÜ�R�D—.‘.  SÓ)Ô*Ù%'£TÑ"ˆE�5˜(Ü" 5¨%Ó0ˆDØ—(‘(“*ˆCØ˜s“?Ð"�?ð )ô 
ˆ,Õr    Ú__main__N)Ú__doc__Úgraphvizr   ÚImportErrorÚcollectionsr   rh   r   r"   r(   r+   r-   r/   r1   r3   r6   r8   r;   r=   r?   rI   rK   r—   rž   rŠ   rW   r    r   Ú<module>r¤      s¤   ðñð
	Ý õ $ð 	€ò"ò6"ò"ò"ò"ò"ò"ò"ò"ò"ò"ò"ò"ò÷B!ñ B!òJò$ð ˆzÒá…Kð øðA
 ò 	Ùð	ús   „A ÁA"Á!A"