§
    ƒÛg¬m  ã                   óð   — d Z ddlZddlmZ ddlmZmZ ddlmZ ddl	m
Z
mZmZmZ ddlmZ  ed	d
¦  «        Zi Zd„ Zd„ Z edd¦  «        Zd„ Zd„ Zd„ Zd„ Zd„ Z edd¦  «        Zd„ Zd„ Zd„ Zi Zd„ ZdS )z
Utils for IR analysis
é    N)Úreduce)Ú
namedtupleÚdefaultdicté   )ÚCFGraph)ÚtypesÚerrorsÚirÚconsts)ÚspecialÚuse_defs_resultzusemap,defmapc           	      ó(  — i }i }|                       ¦   «         D �]è\  }}t          ¦   «         x||<   }t          ¦   «         x||<   }|j        D �]³}t          |¦  «        t          v r(t          t          |¦  «                 } ||||¦  «         ŒAt          |t          j        ¦  «        �rt          |j        t          j	        ¦  «        r1t          d„ |j         
                    ¦   «         D ¦   «         ¦  «        }	n t          |j        t          j        ¦  «        rt          |j        j        g¦  «        }	nft          |j        t          j        t          j        t          j        t          j        f¦  «        rd}	n"t#          dt          |j        ¦  «        ¦  «        ‚|j        j        |	vr|                     |j        j        ¦  «         | 
                    ¦   «         D ]%}
|
j        |vr|                     |
j        ¦  «         Œ&�Œµ�Œêt)          ||¬¦  «        S )z*
    Find variable use/def per block.
    c              3   ó$   K  — | ]}|j         V — Œd S ©N©Úname)Ú.0Úvars     úI/granary/edev/quantum/lib/python3.11/site-packages/numba/core/analysis.pyú	<genexpr>z#compute_use_defs.<locals>.<genexpr>(   s$   è è € Ð!MÐ!M¨s #¤(Ð!MÐ!MÐ!MÐ!MÐ!MÐ!Mó    © Úunreachable)ÚusemapÚdefmap)ÚitemsÚsetÚbodyÚtypeÚir_extension_usedefsÚ
isinstancer
   ÚAssignÚvalueÚInstÚ	list_varsÚVarr   ÚArgÚConstÚGlobalÚFreeVarÚAssertionErrorÚtargetÚaddÚ_use_defs_result)ÚblocksÚvar_use_mapÚvar_def_mapÚoffsetÚir_blockÚuse_setÚdef_setÚstmtÚfuncÚrhs_setr   s              r   Úcompute_use_defsr9      sí  € ð
 €KØ€KØ"ŸLšL™NœNð *ñ *Ñˆ�Ý(+©¬Ð-ˆ�FÑ˜gÝ(+©¬Ð-ˆ�FÑ˜gØ”Mð 	*ñ 	*ˆDÝ�D‰zŒzÕ1Ð1Ð1Ý+­D°©J¬JÔ7�Ø��T˜7 GÑ,Ô,Ð,ØÝ˜$¥¤	Ñ*Ô*ñ 2Ý˜dœj­"¬'Ñ2Ô2ð JÝ!Ð!MÐ!M°d´j×6JÒ6JÑ6LÔ6LÐ!MÑ!MÔ!MÑMÔM�G�GÝ ¤
­B¬FÑ3Ô3ð JÝ! 4¤:¤?Ð"3Ñ4Ô4�G�GÝ ¤
­R¬VµR´X½r¼yÝ-/¬Zð-9ñ :ô :ð Jà �G�Gå(¨½¸T¼ZÑ8HÔ8HÑIÔIÐIà”;Ô#¨7Ð2Ð2Ø—K’K ¤Ô 0Ñ1Ô1Ð1à—~’~Ñ'Ô'ð *ð *�à”8 7Ð*Ð*Ø—K’K ¤Ñ)Ô)Ð)øñ*ñ'	*õ0  ;°{ÐCÑCÔCÐCr   c                 óö   ‡ ‡‡‡	‡
— d„ Š
ˆ
fd„}ˆ ˆˆfd„}ˆ ˆ	ˆfd„}i }|                      ¦   «         D ]}t          ‰|         ¦  «        ||<   Œt          t          ¦  «        Š	 ||‰	¦  «          |||¦  «         |S )z¾
    Find variables that must be alive at the ENTRY of each block.
    We use a simple fix-point algorithm that iterates until the set of
    live variables is unchanged for each block.
    c                 óX   — t          d„ |                      ¦   «         D ¦   «         ¦  «        S )zFHelper function to determine if a fix-point has been reached.
        c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r   )Úlen©r   Úvs     r   r   z?compute_live_map.<locals>.fix_point_progress.<locals>.<genexpr>E   s(   è è € Ð2Ð2 •S˜‘V”VÐ2Ð2Ð2Ð2Ð2Ð2r   )ÚtupleÚvalues)Údcts    r   Úfix_point_progressz,compute_live_map.<locals>.fix_point_progressB   s)   € õ Ð2Ð2 S§Z¢Z¡\¤\Ð2Ñ2Ô2Ñ2Ô2Ð2r   c                 ón   •— d} ‰|¦  «        }||k    r  | |¦  «         |} ‰|¦  «        }||k    °dS dS )z4Helper function to run fix-point algorithm.
        Nr   )ÚfnrB   Ú	old_pointÚ	new_pointrC   s       €r   Ú	fix_pointz#compute_live_map.<locals>.fix_pointG   s`   ø€ ð ˆ	Ø&Ð& sÑ+Ô+ˆ	Ø˜9Ò$Ð$ØˆBˆs‰GŒGˆGØ!ˆIØ*Ð*¨3Ñ/Ô/ˆIð ˜9Ò$Ð$Ð$Ð$Ð$Ð$r   c                 ó¶   •— ‰D ]T}‰|         ‰|         z  }| |xx         |z  cc<   ‰                      |¦  «        D ]\  }}| |xx         | |         z  cc<   ŒŒUdS )zGFind all variable definition reachable at the entry of a block
        N)Ú
successors)rB   r2   Úused_or_definedÚout_blkÚ_Úcfgr1   r0   s        €€€r   Ú	def_reachz#compute_live_map.<locals>.def_reachQ   sˆ   ø€ ð "ð 	,ð 	,ˆFØ)¨&Ô1°KÀÔ4GÑGˆOØ�ˆKˆKŒK˜?Ñ*ˆKˆK‰Kà!Ÿnšn¨VÑ4Ô4ð ,ð ,‘
�˜Ø�G��”  F¤Ñ+��‘�ð,ð		,ð 	,r   c                 ó    •— | D ]I}| |         }‰                      |¦  «        D ])\  }}|‰|         z  }| |xx         |‰|         z
  z  cc<   Œ*ŒJdS )z?Find live variables.

        Push var usage backward.
        N)Úpredecessors)	rB   r2   Ú	live_varsÚinc_blkÚ_dataÚ	reachablerN   Údef_reach_mapr1   s	         €€€r   Úlivenessz"compute_live_map.<locals>.liveness[   s…   ø€ ð
 ð 	Að 	AˆFà˜FœˆIØ"%×"2Ò"2°6Ñ":Ô":ð Að A‘�˜à%¨°gÔ(>Ñ>�	à�G��” 	¨K¸Ô,@Ñ @Ñ@��‘�ð	Að	Að 	Ar   )Úkeysr   r   )rN   r/   r0   r1   rH   rO   rW   Úlive_mapr2   rV   rC   s   ` ``     @@r   Úcompute_live_maprZ   <   sê   øøøøø€ ð3ð 3ð 3ð
0ð 0ð 0ð 0ð 0ð,ð ,ð ,ð ,ð ,ð ,ð ,ðAð Að Að Að Að Að Að €HØ—+’+‘-”-ð 4ð 4ˆÝ˜{¨6Ô2Ñ3Ô3ˆ�ÑÐå¥Ñ$Ô$€MØ€Iˆi˜Ñ'Ô'Ð'Ø€Iˆh˜Ñ!Ô!Ð!Ø€Or   Údead_maps_resultzinternal,escaping,combinedc                 ób  ‡‡‡— t          t          ¦  «        Št          t          ¦  «        Št          t          ¦  «        }|                     ¦   «         D �]\  }}‰|         ||         z  }t          ˆfd„|                      |¦  «        D ¦   «         ¦  «        }t          d„ |j                             ¦   «         D ¦   «         ¦  «        }	t          t          j	        | 
                    ¦   «         t          ¦   «         ¦  «        }
|
|	z  }
||
z
  }|‰|<   ||z
  }|                     ¦   «         D ]#\  }}|||         z  }‰|xx         ||z
  z  cc<   Œ$|s|	||<   �Œt          t          j	        ‰ 
                    ¦   «         t          ¦   «         ¦  «        }t          t          j	        ‰ 
                    ¦   «         t          ¦   «         ¦  «        }t          t          j	        ‰ 
                    ¦   «         t          ¦   «         ¦  «        }t          t          j	        | 
                    ¦   «         t          ¦   «         ¦  «        }||z  |z  }||z
  }|r9|                      ¦   «         sn$d                     |¦  «        }t          |¦  «        ‚t          ˆˆfd„|D ¦   «         ¦  «        }t          ‰‰|¬¦  «        S )z©
    Compute the end-of-live information for variables.
    `live_map` contains a mapping of block offset to all the living
    variables at the ENTRY of the block.
    c              3   ó2   •K  — | ]\  }}|‰|         fV — Œd S r   r   )r   rL   rT   rY   s      €r   r   z$compute_dead_maps.<locals>.<genexpr>Š   sM   øè è € ð !Oð !OÙ%3 W¨eð #*¨8°GÔ+<Ð!=ð !Oð !Oð !Oð !Oð !Oð !Or   c              3   ó$   K  — | ]}|j         V — Œd S r   r   r>   s     r   r   z$compute_dead_maps.<locals>.<genexpr>�   s@   è è € ð !Kð !KØ%&ð "#¤ð !Kð !Kð !Kð !Kð !Kð !Kr   z#liveness info missing for vars: {0}c              3   ó>   •K  — | ]}|‰|         ‰|         z  fV — Œd S r   r   )r   ÚkÚescaping_dead_mapÚinternal_dead_maps     €€r   r   z$compute_dead_maps.<locals>.<genexpr>¶   sM   øè è € ð %ð %Øð Ð)¨!Ô,Ð/@ÀÔ/CÑCÐDð %ð %ð %ð %ð %ð %r   )ÚinternalÚescapingÚcombined)r   r   r   ÚdictrJ   Ú
terminatorr%   r   ÚoperatorÚor_rA   Úexit_pointsÚformatÚRuntimeErrorÚ_dead_maps_result)rN   r/   rY   r1   Úexit_dead_mapr2   r3   Úcur_live_setÚoutgoing_live_mapÚterminator_livesetÚcombined_livesetÚinternal_setÚescaping_live_setrL   Únew_live_setÚall_varsÚinternal_dead_varsÚescaping_dead_varsÚexit_dead_varsÚ	dead_varsÚmissing_varsÚmsgre   ra   rb   s     `                    @@r   Úcompute_dead_mapsr}   v   s  øøø€ õ $¥CÑ(Ô(Ðå#¥CÑ(Ô(Ðå¥Ñ$Ô$€Mà"ŸLšL™NœNð 7ñ 7Ñˆ�ð   Ô'¨+°fÔ*=Ñ=ˆå ð !Oð !Oð !Oð !OØ7:·~²~ÀfÑ7MÔ7Mð!Oñ !Oô !Oñ Oô OÐõ !ð !Kð !KØ*2Ô*=×*GÒ*GÑ*IÔ*Ið!Kñ !Kô !Kñ Kô KÐõ "¥(¤,Ð0A×0HÒ0HÑ0JÔ0JÝ"%¡%¤%ñ)ô )Ðð 	Ð.Ñ.Ðð $Ð&6Ñ6ˆØ$0Ð˜&Ñ!à(¨<Ñ7ÐØ%6×%<Ò%<Ñ%>Ô%>ð 	Kð 	KÑ!ˆG�\à'¨+°gÔ*>Ñ>ˆLØ˜gÐ&Ð&Ô&Ð*;¸lÑ*JÑJÐ&Ð&Ñ&Ð&ð !ð 	7à$6ˆM˜&Ñ!ùõ •h”l H§O¢OÑ$5Ô$5µs±u´uÑ=Ô=€HÝ¥¤Ð.?×.FÒ.FÑ.HÔ.HÝ #¡¤ñ'ô 'Ðå¥¤Ð.?×.FÒ.FÑ.HÔ.HÝ #¡¤ñ'ô 'Ðå�HœL¨-×*>Ò*>Ñ*@Ô*@Å#Á%Ä%ÑHÔH€NØ#Ð&8Ñ8¸>ÑI€IØ˜iÑ'€LØð $à�ŠÑ Ô ð 	$àà7×>Ò>¸|ÑLÔLˆCÝ˜sÑ#Ô#Ð#åð %ð %ð %ð %ð %Ø#ð%ñ %ô %ñ %ô %€Hõ Ð&7Ø&7Ø&.ð0ñ 0ô 0ð 0r   c                 ó  ‡— t          t          ¦  «        Šˆfd„}d} |¦   «         }||k    r^|D ]I}‰|         ||         z  }|||         z  }|                      |¦  «        D ]\  }	}
‰|	xx         |z  cc<   ŒŒJ|} |¦   «         }||k    °^‰S )zÙ
    Compute the live variables at the beginning of each block
    and at each yield point.
    The ``var_def_map`` and ``var_dead_map`` indicates the variable defined
    and deleted at each block, respectively.
    c                  ól   •— t          t          t          ‰                      ¦   «         ¦  «        ¦  «        S r   )r@   Úmapr=   rA   )Úblock_entry_varss   €r   rC   z2compute_live_variables.<locals>.fix_point_progressÈ   s(   ø€ Ý•S�Ð.×5Ò5Ñ7Ô7Ñ8Ô8Ñ9Ô9Ð9r   N)r   r   rJ   )rN   r/   r1   Úvar_dead_maprC   rF   rG   r2   ÚavailÚsuccrT   r�   s              @r   Úcompute_live_variablesr…   ¾   sï   ø€ õ #¥3Ñ'Ô'Ðð:ð :ð :ð :ð :ð €IØ"Ð"Ñ$Ô$€Ið �yÒ
 Ð
 ð ð 	0ð 	0ˆFà$ VÔ,¨{¸6Ô/BÑBˆEà�\ &Ô)Ñ)ˆEà"Ÿ~š~¨fÑ5Ô5ð 0ð 0‘��eØ  Ð&Ð&Ô&¨%Ñ/Ð&Ð&Ñ&Ð&ð0ð ˆ	Ø&Ð&Ñ(Ô(ˆ	ð �yÒ
 Ð
 ð Ðr   c                 ó^  — t          ¦   «         }| D ]}|                     |¦  «         Œ|                      ¦   «         D ]9\  }}|j        }|                     ¦   «         D ]}|                     ||¦  «         ŒŒ:|                     t          | ¦  «        ¦  «         |                     ¦   «          |S r   )	r   Úadd_noder   rg   Úget_targetsÚadd_edgeÚset_entry_pointÚminÚprocess)r/   rN   r`   ÚbÚtermr,   s         r   Úcompute_cfg_from_blocksr�   ë   s²   € Ý
‰)Œ)€CØð ð ˆØ�Š�Q‰Œˆˆà—’‘”ð $ð $‰ˆˆ1ØŒ|ˆØ×&Ò&Ñ(Ô(ð 	$ð 	$ˆFØ�LŠL˜˜FÑ#Ô#Ð#Ð#ð	$ð ×Ò�˜F™œÑ$Ô$Ð$Ø‡K‚K�M„M€MØ€Jr   c              #   óº  K  — t          ¦   «         }|                      ¦   «                              ¦   «         D ]_}t          |j        ¦  «        t          |j        ¦  «        z  t          |j        ¦  «        z  }|                     |j        ¦  «         ||z  }Œ`|                      ¦   «                              ¦   «         D ]}|j        |vrt          | |¦  «        V — ŒdS )zK
    A generator that yields toplevel loops given a control-flow-graph
    N)	r   ÚloopsrA   r   ÚentriesÚexitsÚdiscardÚheaderÚ_fix_loop_exit)rN   Úblocks_in_loopÚloopÚinsiderss       r   Úfind_top_level_loopsrš   ú   sÐ   è è € õ ‘U”U€Nà—	’	‘”×"Ò"Ñ$Ô$ð #ð #ˆÝ�t”y‘>”>¥C¨¬Ñ$5Ô$5Ñ5½¸D¼J¹¼ÑGˆØ×Ò˜œÑ%Ô%Ð%Ø˜(Ñ"ˆˆà—	’	‘”×"Ò"Ñ$Ô$ð ,ð ,ˆØŒ;˜nÐ,Ð,Ý   dÑ+Ô+Ð+Ð+Ð+øð,ð ,r   c                 óè   ‡— |                       ¦   «         Št          t          j        ˆfd„|j        D ¦   «         |j        ¦  «        }|r)|j        |j        |z
  z  }|                     ||¬¦  «        S |S )zf
    Fixes loop.exits for Py3.8 bytecode CFG changes.
    This is to handle `break` inside loops.
    c                 ó    •— g | ]
}‰|         ‘ŒS r   r   )r   r�   Úpostdomss     €r   ú
<listcomp>z"_fix_loop_exit.<locals>.<listcomp>  s   ø€ Ð)Ð)Ð)˜ˆ�!ŒÐ)Ð)Ð)r   )r“   r   )Úpost_dominatorsr   rh   Úand_r“   r   Ú_replace)rN   r˜   r“   r   r�   s       @r   r–   r–   
  s€   ø€ ð ×"Ò"Ñ$Ô$€HÝÝŒØ)Ð)Ð)Ð)˜dœjÐ)Ñ)Ô)ØŒ
ñô €Eð
 ð àŒy˜4œ:¨Ñ-Ñ-ˆØ�}Š} 5¨tˆ}Ñ4Ô4Ð4àˆr   Ú	nullifiedz!condition, taken_br, rewrite_stmtc                 ó¨  ‡‡+‡,‡-‡.‡/‡0— ddl mŠ/mŠ0m}m} dŠ+ˆ/ˆ0fd„}ˆ-fd„Š.ˆ+ˆ.fd„}ˆ+ˆ.fd„}ˆ+ˆ.fd„} G d„ d	t
          ¦  «        Š,ˆ,ˆfd
„}‰+dk    rDt          d                     dd¦  «        ¦  «         t          |                      ¦   «         ¦  «         t          ¦   «         }	t          ¦   «         }
| j
                             ¦   «         D ]l\  }}|j        D ]_}t          |t          j        ¦  «        rCt          |j        t          j        ¦  «        r$|j        j        dk    r||	|j        <   ||
|j        <   Œ`Œm || ¦  «        }g }|D �]½\  Š-}}g }t          |t          j        ¦  «        rÿ|j        dk    rô|}|j        |j        fD ]š} ‰,¦   «         } ‰0‰/| |¦  «        }t          |t          j        ¦  «        r ||j        ¦  «        }|}n/	  || |¦  «        }|€t/          j        d¦  «        }n# |$ r Y nw xY wt          |‰,¦  «        s|                     |¦  «         Œ›t5          |¦  «        dk    r4 |‰-||g|¢R Ž \  }}|r$|                     t7          ||d¦  «        ¦  «         �Œ" ‰,¦   «         }	  ‰/| ‰-j        ¦  «        } || |j        d         ¦  «        }|€t/          j        d¦  «        }n# |$ r Y nw xY wt          |‰,¦  «        s6 |‰-||¦  «        \  }}|r$|                     t7          ||d¦  «        ¦  «         �Œ¿d„ |D ¦   «         }|D ]¶\  }}}||v r¬|j        D ]¤}t          |t          j        ¦  «        rˆ|j        |u r||                     |¦  «                 }|j        r]|j        }t          j         ||j!        ¬¦  «        |_        | j"        |j#        j$                 }|                     |¦  «        } |j        || <   Œ¥Œ·tK          | j
        ¦  «        }!|! &                    ¦   «         }"|	                     ¦   «         D �]U\  }#}||"v rŒd„ |! '                    |¦  «        D ¦   «         }$tQ          |$¦  «        tQ          |#j)        ¦  «        k    �rt5          |$¦  «        dk    r9|#j)                             |$d         ¦  «        }%|#j*        |%         |
|#         _        Œœg }&g }'tW          |#j*        |#j)        ¦  «        D ]4\  }(})|)|"v rŒ
|&                     |(¦  «         |'                     |)¦  «         Œ5|#j*         ,                    ¦   «          |#j*         -                    |&¦  «         |#j)         ,                    ¦   «          |#j)         -                    |'¦  «         �ŒW|"D ]
}*| j
        |*= Œ|rt]          j/        | ¦  «        | _0        ‰+dk    rFt          d                     dd¦  «        ¦  «         t          |                      ¦   «         ¦  «         dS dS )zÓ
    Removes dead branches based on constant inference from function args.
    This directly mutates the IR.

    func_ir is the IR
    called_args are the actual arguments with which the function is called
    r   )Úget_definitionÚguardÚ
find_constÚGuardExceptionc                 óÎ  •— g }| j                              ¦   «         D ]Ç}|j        d         }t          |t          j        ¦  «        rž|} ‰	‰| |j        j        ¦  «        }|�ƒt          |dd ¦  «        dk    rn ‰	‰| |j	        ¦  «        }|�Zt          |t          j
        ¦  «        r@|j        t          u r2 ‰	‰| |j        d         ¦  «        }|�|                     |||f¦  «         ŒÈ|S )NéÿÿÿÿÚopÚcallr   )r/   rA   r   r!   r
   ÚBranchÚcondr   Úgetattrr7   r)   r#   ÚboolÚargsÚappend)
Úfunc_irÚbranchesÚblkÚbranch_or_jumpÚbranchÚpredÚfunctionÚ	conditionr¤   r¥   s
           €€r   Úfind_branchesz(dead_branch_prune.<locals>.find_branches0  sú   ø€ àˆØ”>×(Ò(Ñ*Ô*ð 	Fð 	FˆCØ œX bœ\ˆNÝ˜.­"¬)Ñ4Ô4ð 
FØ'�Ø�u˜^¨W°f´kÔ6FÑGÔG�ØÐ#­°°d¸DÑ(AÔ(AÀVÒ(KÐ(KØ$˜u ^°W¸d¼iÑHÔH�HØ Ð,Ý" 8­R¬YÑ7Ô7ð -à$œN­dÐ2Ð2Ø$) E¨.¸'À4Ä9ÈQÄ<Ñ$PÔ$P˜	Ø$Ð0Ø$ŸOšO¨V°YÀÐ,DÑEÔEÐEøØˆr   c                 óŒ   •— | r‰j         n‰j        }t          j        |‰j        ¬¦  «        }||j        d<   |‰j         k    rdndS )N©Úlocr©   r   r   )ÚtruebrÚfalsebrr
   ÚJumpr½   r   )Útake_truebrr´   ÚkeepÚjmpr¶   s       €r   Údo_prunez#dead_branch_prune.<locals>.do_pruneB  sL   ø€ Ø +Ð?ˆvŒ}ˆ}°´ˆåŒg�d ¤
Ð+Ñ+Ô+ˆØˆŒ�‰Ø˜FœMÒ)Ð)ˆqˆq¨qÐ0r   c                 óV  •— |\  }}t          |t          j        ¦  «        }t          |t          j        ¦  «        }|s|rj	 |                     ||¦  «        }n# t          $ r Y dS w xY w‰dk    r+|r| j        n| j        }	t          d|	z  | |||j        ¦  «          ‰||¦  «        }
d|
fS dS ©N©FNr   ú
Pruning %sT)r!   r   ÚNoneTyperE   Ú	Exceptionr¿   r¾   Úprint)r¶   r¹   r´   ÚcondsÚlhs_condÚrhs_condÚlhs_noneÚrhs_nonerÁ   ÚkillÚtakenÚDEBUGrÄ   s              €€r   Úprune_by_typez(dead_branch_prune.<locals>.prune_by_typeI  sÛ   ø€ ð #Ñˆ�(Ý˜h­¬Ñ7Ô7ˆÝ˜h­¬Ñ7Ô7ˆØð 
	�xð 
	ð#Ø'Ÿlšl¨8°XÑ>Ô>��øÝð #ð #ð #Ø"�{�{ð#øøøà�qŠyˆyØ)4ÐG�v”~�~¸&¼-�Ý�l TÑ)¨6°8¸XØ”lñ$ô $ð $à�H˜[¨#Ñ.Ô.ˆEØ˜�;ÐØˆ{s   Á A Á
A%Á$A%c                 óâ   •— |\  }}	 |                      ||¦  «        }n# t          $ r Y dS w xY w‰	dk    r+|r| j        n| j        }t	          d|z  | |||j         ¦  «          ‰
||¦  «        }d|fS rÆ   )rE   rÊ   r¿   r¾   rË   )r¶   r¹   r´   rÌ   rÍ   rÎ   rÁ   rÑ   rÒ   rÓ   rÄ   s            €€r   Úprune_by_valuez)dead_branch_prune.<locals>.prune_by_value\  sœ   ø€ Ø"Ñˆ�(ð	Ø#Ÿ,š, x°Ñ:Ô:ˆKˆKøÝð 	ð 	ð 	Ø�;�;ð	øøøà�1Š9ˆ9Ø%0ÐC�6”>�>°f´mˆDÝ�, Ñ% v¨x¸À9Ä<ÑPÔPÐPØ�˜ cÑ*Ô*ˆØ�Uˆ{Ðs   ˆ Ÿ
-¬-c                 óF  •— 	 t          |t          j        t          j        t          j        f¦  «        st          d¦  «        ‚t          |j        ¦  «        }n# t
          $ r Y dS w xY w‰dk    r$|r| j        n| j	        }t          d|z  | |¦  «          ‰||¦  «        }d|fS )NzExpected constant Numba IR noderÇ   r   rÈ   T)r!   r
   r(   r*   r)   Ú	TypeErrorr¯   r#   r¿   r¾   rË   )r¶   r·   r´   rÁ   rÑ   rÒ   rÓ   rÄ   s         €€r   Úprune_by_predicatez-dead_branch_prune.<locals>.prune_by_predicateh  s¹   ø€ ð	õ ˜d¥R¤X­r¬z½2¼9Ð$EÑFÔFð CÝÐ AÑBÔBÐBÝ˜tœzÑ*Ô*ˆKˆKøÝð 	ð 	ð 	Ø�;�;ð	øøøà�1Š9ˆ9Ø%0ÐC�6”>�>°f´mˆDÝ�, Ñ% v¨tÑ4Ô4Ð4Ø�˜ cÑ*Ô*ˆØ�Uˆ{Ðs   ƒAA Á
A&Á%A&c                   ó   — e Zd ZdS )ú"dead_branch_prune.<locals>.UnknownN)Ú__name__Ú
__module__Ú__qualname__r   r   r   ÚUnknownrÛ   w  s   € € € € € Øˆr   rß   c                 ó$  •— ‰|          }t          |t          j        ¦  «        r|S t          |t          j        ¦  «        r9|j        }t          |t          j        ¦  «        r|S |€t          j        d¦  «        S t          |d ‰¦   «         ¦  «        S )zC
        Resolves an input arg to a constant (if possible)
        NÚnoneÚliteral_type)r!   r   rÉ   ÚOmittedr#   r®   )Úinput_arg_idxÚinput_arg_tyÚvalrß   Úcalled_argss      €€r   Úresolve_input_arg_constz2dead_branch_prune.<locals>.resolve_input_arg_constz  s‘   ø€ ð # =Ô1ˆõ �l¥E¤NÑ3Ô3ð 	 ØÐõ �l¥E¤MÑ2Ô2ð 	.ØÔ$ˆCÝ˜#�uœ~Ñ.Ô.ð .Ø�
Ø�Ý”~ fÑ-Ô-Ð-õ
 �| ^°W°W±Y´YÑ?Ô?Ð?r   r   ÚbeforeéP   ú-ÚphiÚbinopNrá   é   TFc                 ó   — g | ]	}|j         ‘Œ
S r   )r¹   ©r   Úxs     r   rž   z%dead_branch_prune.<locals>.<listcomp>ç  s   € Ð:Ð:Ð: �”Ð:Ð:Ð:r   r¼   c                 ó   — g | ]
}|d          ‘ŒS )r   r   rð   s     r   rž   z%dead_branch_prune.<locals>.<listcomp>  s   € Ð@Ð@Ð@ ˜˜!œÐ@Ð@Ð@r   Úafter)1Únumba.core.ir_utilsr¤   r¥   r¦   r§   ÚobjectrË   ÚcenterÚdumprf   r/   r   r   r!   r
   r"   r#   ÚExprrª   ÚlhsÚrhsr'   Úindexr   rÉ   r±   r=   r¢   r­   r°   Úrewrite_stmtÚtaken_brr(   r½   Ú_definitionsr,   r   r�   Ú
dead_nodesrQ   r   Úincoming_blocksÚincoming_valuesÚzipÚclearÚextendr   ÚConstantInferenceÚ_consts)1r²   rç   r¦   r§   rº   rÔ   rÖ   rÙ   rè   Úphi2lblÚphi2asgnÚlblr´   r6   Úbranch_infoÚnullified_conditionsr¹   Úconst_condsÚpruneÚargÚresolved_constÚarg_defÚ
prune_statrÒ   Ú	pred_callÚdeadcondrM   r­   rñ   Únullified_infoÚ
branch_bitÚdefnsÚrepl_idxÚnew_cfgÚdead_blocksrì   Únew_incomingÚidxÚ
ic_val_tmpÚ
ic_blk_tmpÚic_valÚic_blkÚdeadrÓ   rß   r¶   rÄ   r¤   r¥   s1    `                                         @@@@@@r   Údead_branch_pruner!  #  sp  øøøøøøø€ ð5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð €Eðð ð ð ð ð ð$1ð 1ð 1ð 1ð 1ðð ð ð ð ð ð&
ð 
ð 
ð 
ð 
ð 
ðð ð ð ð ð ðð ð ð ð •&ñ ô ð ð@ð @ð @ð @ð @ð @ð. ˆq‚y€yÝˆh�oŠo˜b #Ñ&Ô&Ñ'Ô'Ð'Ýˆg�lŠl‰nŒnÑÔÐå‰fŒf€GÝ‰vŒv€HØ”N×(Ò(Ñ*Ô*ð 0ð 0‰ˆˆSØ”Hð 	0ð 	0ˆDÝ˜$¥¤	Ñ*Ô*ð 0Ý˜dœj­"¬'Ñ2Ô2ð 0°t´z´}ÈÒ7MÐ7MØ*-�G˜DœJÑ'Ø+/�H˜TœZÑ(øð		0ð  �- Ñ(Ô(€KàÐà"-ð 0Bñ 0BÑˆ�	˜3ØˆÝ�i¥¤Ñ)Ô)ð .	B¨i¬l¸gÒ.EÐ.EØ"ˆEØ!œ y¤}Ð5ð 7ð 7�Ø!( ¡¤�Ø˜% °¸Ñ=Ô=�Ý˜g¥r¤vÑ.Ô.ð à%<Ð%<¸W¼]Ñ%KÔ%K�NØ)�E�EðØ)3¨°G¸SÑ)AÔ)A˜Ø)Ð1Ý-2¬^¸FÑ-CÔ-C˜NøøØ)ð ð ð Ø˜ðøøøõ " .°'Ñ:Ô:ð 7Ø×&Ò& ~Ñ6Ô6Ð6øõ �;ÑÔ 1Ò$Ð$à$) E¨&°)¸SÐ$OÀ;Ð$OÐ$OÐ$OÑ!�
˜EØð Aà(×/Ò/µ	¸)ÀUØ:>ñ1@ô 1@ñ Aô Að Aùð %˜W™YœYˆNðØ*˜N¨7°F´KÑ@Ô@�	Ø!+ ¨G°Y´^ÀAÔ5FÑ!GÔ!G�Ø!Ð)Ý%*¤^°FÑ%;Ô%;�NøøØ!ð ð ð Ø�ðøøøõ ˜n¨gÑ6Ô6ð BØ$6Ð$6°v¸yÈ#Ñ$NÔ$NÑ!�
˜EØð Bà(×/Ò/µ	¸)ÀUØ:?ñ1Aô 1Añ Bô Bð Bùð$ ;Ð:Ð%9Ð:Ñ:Ô:€HØ#ð 2ð 2‰ˆˆ4�Ø�8ÐÐØ”Xð 2ð 2�Ý˜a¥¤Ñ+Ô+ð 2°´¸4°°à%9¸(¿.º.ÈÑ:NÔ:NÔ%O�Nð &Ô2ð 2Ø%3Ô%<˜
Ý"$¤(¨:¸1¼5Ð"AÑ"AÔ"A˜œà 'Ô 4°Q´X´]Ô C˜Ø#(§;¢;¨tÑ#4Ô#4˜Ø*+¬'˜˜h™øøõB & g¤nÑ5Ô5€GØ×$Ò$Ñ&Ô&€Kð —M’M‘O”Oð 7ñ 7‰ˆˆSØ�+ÐÐØØ@Ð@ g×&:Ò&:¸3Ñ&?Ô&?Ð@Ñ@Ô@ˆÝˆ|ÑÔ¥ CÔ$7Ñ 8Ô 8Ò8Ñ8å�<Ñ Ô  AÒ%Ð%ð Ô)×/Ò/°¸Q´Ñ@Ô@�Ø&)Ô&9¸#Ô&>�˜”Ô#Ð#ð  �
Ø�
Ý&)¨#Ô*=Ø*-Ô*=ñ'?ô '?ð 2ð 2‘N�F˜Fà Ð,Ð,Ø à"×)Ò)¨&Ñ1Ô1Ð1Ø"×)Ò)¨&Ñ1Ô1Ð1Ð1ØÔ#×)Ò)Ñ+Ô+Ð+ØÔ#×*Ò*¨:Ñ6Ô6Ð6ØÔ#×)Ò)Ñ+Ô+Ð+ØÔ#×*Ò*¨:Ñ6Ô6Ð6ùð ð !ð !ˆØŒN˜4Ð Ð ð ð <Ý Ô2°7Ñ;Ô;ˆŒàˆq‚y€yÝˆg�nŠn˜R Ñ%Ô%Ñ&Ô&Ð&Ýˆg�lŠl‰nŒnÑÔÐÐÐð €ys$   Ç"G/Ç/G7Ç6G7É4>J3Ê3J;Ê:J;c                 óº  ‡‡‡‡	‡
— d}|dk    rgt          d| j        j        z                        dd¦  «        ¦  «         t          d                     dd¦  «        ¦  «         |                      ¦   «          ˆ
fd„Šˆˆˆˆ	fd	„}ˆˆˆˆ	fd
„}ddlmŠmŠ | j         	                    ¦   «         D ]a}|j
        D ]WŠ	t          ‰	t          j        ¦  «        r;‰	j        Š
t          ‰
t          j        ¦  «        r |‰
| |¦  «          |‰
| |¦  «         ŒXŒb|dk    rHt          d                     dd¦  «        ¦  «         |                      ¦   «          t          d¦  «         dS dS )aP  
    This rewrites values known to be constant by their semantics as ir.Const
    nodes, this is to give branch pruning the best chance possible of killing
    branches. An example might be rewriting len(tuple) as the literal length.

    func_ir is the IR
    called_args are the actual arguments with which the function is called
    r   r   zrewrite_semantic_constants: rê   rë   ré   Ú*c                 ó²   •— t          j        ||j        ¦  «        |_        | j        |j        j                 }|                     ‰¦  «        }|j        ||<   dS )zr
        Rewrites the stmt as a ir.Const new_val and fixes up the entries in
        func_ir._definitions
        N)r
   r(   r½   r#   rþ   r,   r   rû   )r²   r6   Únew_valr  r  ræ   s        €r   Úrewrite_statementz5rewrite_semantic_constants.<locals>.rewrite_statementU  sL   ø€ õ
 ”X˜g t¤xÑ0Ô0ˆŒ
ØÔ$ T¤[Ô%5Ô6ˆØ—;’;˜sÑ#Ô#ˆØœ*ˆˆh‰ˆˆr   c                 ó"  •— t          | dd ¦  «        dk    rr| j        dk    ri ‰‰|| j        ¦  «        }t          |t          j        ¦  «        r?||j                 }t          |t          j        ¦  «        r ‰|‰|j	        ¦  «         d S d S d S d S d S )Nrª   r®   Úndim)
r®   Úattrr#   r!   r
   r'   rû   r   ÚArrayr(  )	ræ   r²   rç   r  Úargtyr¤   r¥   r&  r6   s	        €€€€r   Úrewrite_array_ndimz6rewrite_semantic_constants.<locals>.rewrite_array_ndim_  sµ   ø€ å�3˜˜dÑ#Ô# yÒ0Ð0ØŒx˜6Ò!Ð!Ø˜% °¸¼ÑCÔC�Ý˜g¥r¤vÑ.Ô.ð EØ'¨¬Ô6�EÝ! %­¬Ñ5Ô5ð EØ)Ð)¨'°4¸¼ÑDÔDÐDÐDÐDð 1Ð0Ø!Ð!ðEð EðEð Er   c                 óf  •— t          | dd ¦  «        dk    �r ‰‰|| j        ¦  «        }|�ût          |t          j        ¦  «        rãt          |dd ¦  «        t
          u rÍ| j        \  } ‰‰||¦  «        }t          |t          j        ¦  «        r=||j                 }t          |t          j
        ¦  «        r ‰	|‰
|j        ¦  «         d S d S t          |t          j        ¦  «        rH|j        dk    r?|j        }t          |t          j
        ¦  «        r  ‰	|‰
|j        ¦  «         d S d S d S d S d S d S d S d S )Nrª   r«   r#   Útyped_getitem)r®   r7   r!   r
   r)   r=   r°   r'   rû   r   Ú	BaseTupleÚcountrø   rª   Údtype)ræ   r²   rç   r7   r  r  r+  r¤   r¥   r&  r6   s          €€€€r   Úrewrite_tuple_lenz5rewrite_semantic_constants.<locals>.rewrite_tuple_leni  sk  ø€ å�3˜˜dÑ#Ô# vÒ-Ñ-Ø�5˜¨°#´(Ñ;Ô;ˆDØÐ ¥Z°µb´iÑ%@Ô%@Ð Ý˜D '¨4Ñ0Ô0µCÐ7Ð7àœ‘�Ø˜% °¸Ñ=Ô=�Ý˜g¥r¤vÑ.Ô.ð FØ'¨¬Ô6�EÝ! %­¬Ñ9Ô9ð FØ)Ð)¨'°4¸¼ÑEÔEÐEÐEÐEðFð Få  ­"¬'Ñ2Ô2ð FØ”j OÒ3Ð3Ø#œM�EÝ! %­¬Ñ9Ô9ð FØ)Ð)¨'°4¸¼ÑEÔEÐEÐEÐEð .Ð-à Ð Ð Ð Ø7Ð7ðFð FØ3Ð3ðFð Fr   )r¤   r¥   ró   zP--------------------------------------------------------------------------------N)rË   Úfunc_idÚ	func_namerö   r÷   rô   r¤   r¥   r/   rA   r   r!   r
   r"   r#   rø   )r²   rç   rÓ   r,  r2  r´   r¤   r¥   r&  r6   ræ   s         @@@@@r   Úrewrite_semantic_constantsr5  D  sà  øøøøø€ ð €Eàˆq‚y€yÝÐ-ØŒÔ(ñ)ß*0ª&°°S©/¬/ñ	;ô 	;ð 	;åˆh�oŠo˜b #Ñ&Ô&Ñ'Ô'Ð'Ø�Š‰Œˆð%ð %ð %ð %ð %ðEð Eð Eð Eð Eð Eð Eð EðFð Fð Fð Fð Fð Fð Fð Fð& :Ð9Ð9Ð9Ð9Ð9Ð9Ð9ØŒ~×$Ò$Ñ&Ô&ð Að AˆØ”Hð 	Að 	AˆDÝ˜$¥¤	Ñ*Ô*ð AØ”j�Ý˜c¥2¤7Ñ+Ô+ð AØ&Ð& s¨G°[ÑAÔAÐAØ%Ð% c¨7°KÑ@Ô@Ð@øð	Að ˆq‚y€yÝˆg�nŠn˜R Ñ%Ô%Ñ&Ô&Ð&Ø�Š‰ŒˆÝˆh‰Œˆˆˆð €yr   c                 ó˜  — ddl m} t          ¦   «         }i }| j                             ¦   «         D �]}|                     d¬¦  «        D ]ê}|                     |j        | |j        ¦  «        }t          |t          j        t          j        f¦  «        r|j        }n|                     |j        | |¦  «        }|t          j        u ro|j        \  }	|                      |	¦  «        }
t          |
t          j        ¦  «        r7|
j        }|                     |¦  «         |                     ||j        ¦  «         Œë�Œ|D ]‘}||         }t          |t.          j        ¦  «        o|j        du }|r||         }t5          j        ||¬¦  «        ‚t          |t.          j        t.          j        f¦  «        s||         }t5          j        ||¬¦  «        ‚Œ’dS )a3  An analysis to find `numba.literally` call inside the given IR.
    When an unsatisfied literal typing request is found, a `ForceLiteralArg`
    exception is raised.

    Parameters
    ----------

    func_ir : numba.ir.FunctionIR

    argtypes : Sequence[numba.types.Type]
        The argument types.
    r   )Úir_utilsr«   )rª   Nr¼   )Ú
numba.corer7  r   r/   rA   Ú
find_exprsr¥   r¤   r7   r!   r
   r)   r*   r#   Úresolve_func_from_moduler   Ú	literallyr°   r'   rû   r-   Ú
setdefaultr½   r   ÚInitialValueÚinitial_valuer	   ÚForceLiteralArgÚLiteral)r²   Úargtypesr7  Úmarked_argsÚ	first_locr´   Úassignr   Úfnobjr  ÚdefargÚargindexÚposÚ	query_argÚdo_raiser½   s                   r   Úfind_literally_callsrK  ‹  sÞ  € ð $Ð#Ð#Ð#Ð#Ð#å‘%”%€KØ€IàŒ~×$Ò$Ñ&Ô&ð ?ñ ?ˆØ—n’n¨�nÑ/Ô/ð 	?ð 	?ˆFØ—.’. Ô!8¸'À6Ä;ÑOÔOˆCÝ˜#¥¤	­2¬:Ð6Ñ7Ô7ð 5Øœ	��à Ÿš xÔ'HØ'.°ñ5ô 5�à�Ô)Ð)Ð)àœ‘�Ø ×/Ò/°Ñ4Ô4�Ý˜f¥b¤fÑ-Ô-ð ?Ø%œ|�HØ—O’O HÑ-Ô-Ð-Ø×(Ò(¨°6´:Ñ>Ô>Ð>øñ	?ð  ð 
?ð 
?ˆØ˜S”Mˆ	Ý˜y­%Ô*<Ñ=Ô=ð 4ØÔ+¨tÐ3ð 	àð 	?Ø˜C”.ˆCÝÔ(¨¸#Ð>Ñ>Ô>Ð>å˜)¥e¤mµUÔ5GÐ%HÑIÔIð 	?Ø˜C”.ˆCÝÔ(¨¸#Ð>Ñ>Ô>Ð>ð	?ð
?ð 
?r   c                 óÞ   — t          ¦   «         }|                      ¦   «         D ]I}|j        D ]?}t          |¦  «        t          v r't          t          |¦  «                 } |||¦  «         Œ?Œ@ŒJ|S )aø  
    Analyzes a dictionary of blocks to find variables that must be
    stack allocated with alloca.  For each statement in the blocks,
    determine if that statement requires certain variables to be
    stack allocated.  This function uses the extension point
    ir_extension_use_alloca to allow other IR node types like parfors
    to register to be processed by this analysis function.  At the
    moment, parfors are the only IR node types that may require
    something to be stack allocated.
    )r   rA   r   r   Úir_extension_use_alloca)r/   Úuse_alloca_varsr3   r6   r7   s        r   Úmust_use_allocarO  ¾  s~   € õ ‘e”e€Oà—M’M‘O”Oð ð ˆØ”Mð 	ð 	ˆDÝ�D‰zŒzÕ4Ð4Ð4Ý.­t°D©z¬zÔ:�Ø��T˜?Ñ+Ô+Ð+Øð 5ð	ð Ðr   ) Ú__doc__rh   Ú	functoolsr   Úcollectionsr   r   Úcontrolflowr   r8  r   r	   r
   r   Ú
numba.miscr   r.   r    r9   rZ   rm   r}   r…   r�   rš   r–   r¢   r!  r5  rK  rM  rO  r   r   r   ú<module>rU     s�  ððð ð €€€Ø Ð Ð Ð Ð Ð Ø /Ð /Ð /Ð /Ð /Ð /Ð /Ð /à  Ð  Ð  Ð  Ð  Ð  Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø Ð Ð Ð Ð Ð ð �:Ð/°ÑAÔAÐ ð Ð ð"Dð "Dð "DðJ4ð 4ð 4ðn �JÐ1Ð3OÑPÔPÐ ðE0ð E0ð E0ðP&ð &ð &ðZð ð ð,ð ,ð ,ð ð ð ð* ˆJ�{Ð$GÑHÔH€	ð^ð ^ð ^ðB	Dð Dð DðN-?ð -?ð -?ð` Ð ðð ð ð ð r   