§
    ‚Ûgå!  ã                   óÞ   — d Z 	 ddlmZ n# e$ r Y nw xY w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¦   «          dS dS )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      úS/granary/edev/quantum/lib/python3.11/site-packages/llvmlite/tests/refprune_proto.pyÚcase1r      s9  € ðØˆ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                  ór   — 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   sc   € à�3ˆZØˆUØðð €Eõ
 �ÑÔ€EØ�€Eˆ#�JØ�€Eˆ#�JØ�€Eˆ#�JØ�Tˆ{€HØ�%˜Ð!Ð!r    c                  ón   — t          ¦   «         \  } }}|d                              d¦  «         dd i}| ||fS )Nr   r   r	   ©r   Úappend©r   r   Ú_r   s       r   Úcase3r)   @   ó?   € Ý‘g”g�O€Eˆ5�!à	ˆ#„J×Ò�cÑÔÐØ�Tˆ{€HØ�%˜Ð!Ð!r    c                  ón   — t          ¦   «         \  } }}|d                              d¦  «         dd i}| ||fS )Nr   r
   r	   r%   r'   s       r   Úcase4r,   H   r*   r    c                  ón   — t          ¦   «         \  } }}|d                              d¦  «         dd i}| ||fS )Nr   r   r	   r%   r'   s       r   Úcase5r.   P   r*   r    c                  ón   — t          ¦   «         \  } }}|d                              d¦  «         dd i}| ||fS )Nr   r   r	   r%   r'   s       r   Úcase6r0   X   r*   r    c                  ón   — t          ¦   «         \  } }}|d                              d¦  «         dd i}| ||fS )Nr   r   r	   r%   r'   s       r   Úcase7r2   `   r*   r    c                  óh   — ddgdgg dœ} t          t          ¦  «        }dg|d<   dg|d<   ddhi}|| |fS r"   r   r   s      r   Úcase8r4   h   sZ   € à�3ˆZØˆUØðð €Eõ
 �ÑÔ€EØ�€Eˆ#�JØ�€Eˆ#�JØ�c�Uˆ|€HØ�%˜Ð!Ð!r    c                  ón   — t          ¦   «         \  } }}|d                              d¦  «         dd i}| ||fS )Nr   r   r   ©r4   r&   r'   s       r   Úcase9r7   u   r*   r    c                  óp   — t          ¦   «         \  } }}|d                              d¦  «         ddhi}| ||fS )Nr   r   r6   r'   s       r   Úcase10r9   }   sA   € Ý‘g”g�O€Eˆ5�!à	ˆ#„J×Ò�cÑÔÐØ�c�Uˆ|€HØ�%˜Ð!Ð!r    c                  óz   — t          ¦   «         \  } }}|d                              d¦  «         g |d<   ddhi}| ||fS ©Nr   r	   r   r6   r'   s       r   Úcase11r<   …   sJ   € Ý‘g”g�O€Eˆ5�!Ø	ˆ#„J×Ò�cÑÔÐØ€Eˆ#�JØ�c�Uˆ|€HØ�%˜Ð!Ð!r    c                  ó|   — t          ¦   «         \  } }}|d                              d¦  «         dg|d<   ddhi}| ||fS r;   r6   r'   s       r   Úcase12r>   �   sL   € Ý‘g”g�O€Eˆ5�!Ø	ˆ#„J×Ò�cÑÔÐØ�€Eˆ#�JØ�c�Uˆ|€HØ�%˜Ð!Ð!r    c                  óz   — t          ¦   «         \  } }}|d                              d¦  «         dg|d<   dd i}| ||fS )Nr   r	   r   r   r6   r'   s       r   Úcase13r@   •   sJ   € Ý‘g”g�O€Eˆ5�!Ø	ˆ#„J×Ò�cÑÔÐØ�€Eˆ#�JØ�Tˆ{€HØ�%˜Ð!Ð!r    c                 ó¢   — t          t          ¦  «        }|                      ¦   «         D ]%\  }}|D ]}||                              |¦  «         ŒŒ&|S ©N)r   ÚsetÚitemsÚadd)r   ÚdÚsrcÚ	outgoingsÚdsts        r   Úmake_predecessor_maprJ   �   sX   € Ý•CÑÔ€AØŸ+š+™-œ-ð ð ‰ˆˆYØð 	ð 	ˆCØˆcŒF�JŠJ�s‰OŒOˆOˆOð	à€Hr    c                   óV   — 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dS )ÚFanoutAlgorithmFc                 ót   — || _         || _        t          |¦  «        | _        |rt          n| j        | _        d S rB   )r   r   rJ   Ú	rev_edgesÚprintÚ_null_print)Úselfr   r   Úverboses       r   Ú__init__zFanoutAlgorithm.__init__¦   s6   € ØˆŒ
ØˆŒ
Ý-¨eÑ4Ô4ˆŒØ%Ð;•U�U¨4Ô+;ˆŒ
ˆ
ˆ
r    c                 ó*   — |                       ¦   «         S rB   )Úfind_fanout_in_function)rQ   s    r   ÚrunzFanoutAlgorithm.run¬   s   € Ø×+Ò+Ñ-Ô-Ð-r    c                 ó   — d S rB   © )rQ   ÚargsÚkwargss      r   rP   zFanoutAlgorithm._null_print¯   s   € Øˆr    c                 ó¶   — i }| j         D ]N}d„ | j        |         D ¦   «         D ]4}|                      |¦  «        }|                      d|d|¦  «         |||<   Œ5ŒO|S )Nc              3   ó&   K  — | ]}|d k    ¯|V — ŒdS )r   NrX   )Ú.0Úxs     r   ú	<genexpr>z:FanoutAlgorithm.find_fanout_in_function.<locals>.<genexpr>µ   s&   è è € ÐLÐL ¸aÀ8ºm¸m˜1¸m¸m¸m¸mÐLÐLr    z>>z===)r   r   Úfind_fanoutrO   )rQ   ÚgotÚcur_noder   Údecref_blockss        r   rU   z'FanoutAlgorithm.find_fanout_in_function²   s~   € ØˆØœ
ð 	.ð 	.ˆHØLÐL d¤j°Ô&:ÐLÑLÔLð .ð .�Ø $× 0Ò 0°Ñ :Ô :�Ø—
’
˜4 ¨5°-Ñ@Ô@Ð@Ø -��H‘�ð.ð ˆ
r    c                 ó¼   — |                       |¦  «        }|                      d|¦  «         |sd S |                      ||t          ¬¦  «        sd S t	          |¦  «        S )NÚ
candidates)Úentry)Úfind_decref_candidatesrO   Úverify_non_overlappingÚENTRYrC   )rQ   Ú	head_noderc   s      r   r`   zFanoutAlgorithm.find_fanout»   so   € Ø×3Ò3°IÑ>Ô>ˆØ�
Š
�< Ñ/Ô/Ð/Øð 	Ø�4Ø×*Ò*Ø�}­Eð +ñ 
ô 
ð 	ð �4Ý�=Ñ!Ô!Ð!r    c                 ó˜  — |                       d                     dd¦  «        ¦  «         t          |¦  «        }|�r|                     ¦   «         }t	          ¦   «         }|g}~|rã|                     ¦   «         }|                       d|d|¦  «         ||v rŒ3||k    r|                       d|¦  «         dS |                     |¦  «         |                       d|› d	|                      |¦  «        › �¦  «         |                      |¦  «        D ]9}||v r|                       d
¦  «          dS ||k    r|                     |¦  «         Œ:|°ã|�°dS )Nrh   éP   ú-rb   ú|z%!! failed because we arrived at entryFz   z preds z.!! reject because predecessor in decref_blocksT)rO   Úcenterr   ÚpoprC   rE   Úget_predecessorsr&   )	rQ   rj   rc   rf   Útodorb   ÚvisitedÚ	workstackÚpreds	            r   rh   z&FanoutAlgorithm.verify_non_overlappingÆ   s•  € Ø�
Š
Ð+×2Ò2°2°sÑ;Ô;Ñ<Ô<Ð<õ �MÑ"Ô"ˆØñ 	/Ø—x’x‘z”zˆHÝ‘e”eˆGà!˜
ˆIØØð /Ø$Ÿ=š=™?œ?�Ø—
’
˜: x°°iÑ@Ô@Ð@Ø˜wÐ&Ð&ØØ˜uÒ$Ð$à—J’JØ?Àñô ð ð !˜5Ø—’˜HÑ%Ô%Ð%à—
’
ØL˜(ÐLÐL¨4×+@Ò+@ÀÑ+JÔ+JÐLÐLñô ð ð !×1Ò1°(Ñ;Ô;ð 	/ð 	/�DØ˜}Ð,Ð,àŸ
š
ØLñô ð ð  %˜u˜uØ˜yÒ(Ð(à!×(Ò(¨Ñ.Ô.Ð.øð3 ð /ð ñ 	/ðB ˆtr    c                 ó6   — t          | j        |         ¦  «        S rB   )Útupler   ©rQ   Únodes     r   Úget_successorszFanoutAlgorithm.get_successorsî   s   € Ý�T”Z Ô%Ñ&Ô&Ð&r    c                 ó6   — t          | j        |         ¦  «        S rB   )rw   rN   rx   s     r   rq   z FanoutAlgorithm.get_predecessorsñ   s   € Ý�T”^ DÔ)Ñ*Ô*Ð*r    c                 ó    — d| j         |         v S )Nr   )r   rx   s     r   Ú
has_decrefzFanoutAlgorithm.has_decrefô   s   € Ø˜4œ: dÔ+Ð+Ð+r    é
   c                 óÌ  — dt          |¦  «        z  }|                      |d||¦  «         |dk    rdS ||v r||d         k    rdS dS |                      |¦  «        r-|                     |¦  «         |                      |d¦  «         dS |dz  }||fz  }d}|                      |¦  «        D ]}|                      |||¦  «        sd} nd}Œ |                      |d|› �¦  «         |S )	Nú Úwalkr   FTzfound decrefé   zret )ÚlenrO   r}   rE   rz   Úwalk_child_for_decref)rQ   rb   Ú
path_stackrc   ÚdepthÚindentÚfoundÚchilds           r   r„   z%FanoutAlgorithm.walk_child_for_decref÷   s'  € ð •s˜:‘”Ñ&ˆØ�
Š
�6˜6 :¨xÑ8Ô8Ð8Ø�AŠ:ˆ:Ø�5Ø�zÐ!Ð!Ø˜: aœ=Ò(Ð(Ø�uØ�4Ø�?Š?˜8Ñ$Ô$ð 	Ø×Ò˜hÑ'Ô'Ð'Ø�JŠJ�v˜~Ñ.Ô.Ð.Ø�4à�‰
ˆØ�x�kÑ!ˆ
ØˆØ×(Ò(¨Ñ2Ô2ð 	ð 	ˆEØ×-Ò-Ø�z =ñô ð ð �Ø�à��à�
Š
�6˜> %˜>˜>Ñ*Ô*Ð*Øˆr    c                 ó  — |                       d                     dd¦  «        ¦  «         |f}d}t          ¦   «         }|                      |¦  «        D ]}|                      |||¦  «        sd} nd}Œ |st          ¦   «         S |S )Nrg   rl   rm   FT)rO   ro   rC   rz   r„   )rQ   rb   r…   rˆ   rc   r‰   s         r   rg   z&FanoutAlgorithm.find_decref_candidates  s    € à�
Š
Ð+×2Ò2°2°sÑ;Ô;Ñ<Ô<Ð<Ø�[ˆ
ØˆÝ™œˆØ×(Ò(¨Ñ2Ô2ð 	ð 	ˆEØ×-Ò-Ø�z =ñô ð ð �Ø�à��Øð 	!Ý‘5”5ˆLà Ð r    N)F)r~   )Ú__name__Ú
__module__Ú__qualname__rS   rV   rP   rU   r`   rh   rz   rq   r}   r„   rg   rX   r    r   rL   rL   ¥   sÉ   € € € € € ð<ð <ð <ð <ð.ð .ð .ðð ð ðð ð ð	"ð 	"ð 	"ð&ð &ð &ðP'ð 'ð 'ð+ð +ð +ð,ð ,ð ,ð :<ðð ð ð ð>!ð !ð !ð !ð !r    rL   c            
      ó¬  — t          ¦   «         \  } }}t          ¦   «         }|D ]9}|                     |d|› d�d                     | |         ¦  «        z   ¬¦  «         Œ:|                     ¦   «         D ] \  }}|D ]}|                     ||¦  «         ŒŒ!|                     ¦   «          t          | |d¬¦  «        }|                     ¦   «         }||k    sJ ‚d S )NÚrectú
z\l)ÚshapeÚlabelT)rR   )	r@   r   ry   ÚjoinrD   ÚedgeÚviewrL   rV   )	r   r   r   r   ry   Úchildrenr‰   Úalgora   s	            r   Ú
check_oncer˜   *  së   € Ý#™XœXÑ€Eˆ5�(õ 	‰	Œ	€AØð Pð PˆØ	�Šˆt˜6¨D¨¨¨°u·z²zÀ%ÈÄ+Ñ7NÔ7NÑ)NˆÑOÔOÐOÐOØŸ+š+™-œ-ð  ð  ‰ˆˆhØð 	 ð 	 ˆEØ�FŠF�4˜ÑÔÐÐð	 ð ‡F‚F�H„H€Hå˜5 %°Ð6Ñ6Ô6€DØ
�(Š(‰*Œ*€CØ�sŠ?ˆ?ˆ?ˆ?ˆ?ˆ?r    c                  óp  — t          t          ¦   «                              ¦   «         ¦  «        D ]x\  } }|                      d¦  «        r^t	          |›                      dd¦  «        ¦  «          |¦   «         \  }}}t          ||¦  «        }|                     ¦   «         }||k    sJ ‚Œyt	          d¦  «         d S )NÚcaserl   rm   z
ALL PASSED)r   ÚglobalsrD   Ú
startswithrO   ro   rL   rV   )ÚkÚfnr   r   r   r—   ra   s          r   Ú	check_allrŸ   <  s­   € Ý•g‘i”i—o’oÑ'Ô'Ñ(Ô(ð #ð #‰ˆˆ2Ø�<Š<˜ÑÔð 	#Ý�R�'—.’.  SÑ)Ô)Ñ*Ô*Ð*Ø%' R¡T¤TÑ"ˆE�5˜(Ý" 5¨%Ñ0Ô0ˆDØ—(’(‘*”*ˆCØ˜s’?�?�?�?øÝ	ˆ,ÑÔÐÐÐr    Ú__main__N)Ú__doc__Úgraphvizr   ÚImportErrorÚcollectionsr   ri   r   r#   r)   r,   r.   r0   r2   r4   r7   r9   r<   r>   r@   rJ   rL   r˜   rŸ   r‹   rX   r    r   ú<module>r¥      s§  ððð ð
	Ø Ð Ð Ð Ð Ð Ð øØð 	ð 	ð 	Ø€Dð	øøøà #Ð #Ð #Ð #Ð #Ð #ð 	€ð"ð "ð "ð6"ð "ð "ð"ð "ð "ð"ð "ð "ð"ð "ð "ð"ð "ð "ð"ð "ð "ð
"ð 
"ð 
"ð"ð "ð "ð"ð "ð "ð"ð "ð "ð"ð "ð "ð"ð "ð "ðð ð ðB!ð B!ð B!ð B!ð B!ñ B!ô B!ð B!ðJð ð ð$ð ð ð ˆzÒÐà€I�K„K€K€K€Kð Ðs   „ ‹’