
    ܙdK-                     \   d dl Z d dlZd dlmZmZmZmZ d dlm	Z	m
Z
 d dlmZmZmZmZ d dl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mZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$ d d	l%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m,Z,m0Z0m1Z1 d d
l2m3Z3m4Z4m5Z5 d dl6Z6 e	ej7        fd          d             Z8 e	ej7        fd          d             Z9d Z:d Z;e
d             Z< e5dd           G d de3                      Z=d Z> G d dej?                  Z@ G d de          ZAeBdk    r e6jC                     dS dS )    N)TestCaseoverride_configcaptured_stdoutskip_parfors_unsupported)jitnjit)typesirpostproccompiler)guardfind_callname
find_constget_definitionsimplify_CFG)CPUDispatcher)inline_closure_call)
ExtractByteCodeTranslateByteCode	FixupArgsIRProcessingDeadBranchPruneRewriteSemanticConstantsGenericRewritesWithLifting
PreserveIRInlineClosureLikes)NopythonTypeInferenceAnnotateTypesNopythonRewritesPreParforPass
ParforPassDumpParforDiagnosticsNativeLoweringNativeParforLoweringIRLegalizationNoPythonBackendr$   ParforFusionPassParforPreLoweringPass)FunctionPassPassManagerregister_passTnopythonc                     | dz   S N    as    9lib/python3.11/site-packages/numba/tests/test_inlining.pyinnerr6      s    q5L    c                 :    t          t          |                     S Nr6   r3   s    r5   morer;       s    q??r7   c                 &    t          |           dz  S N   r:   r3   s    r5   outer_simpler?   $   s    88a<r7   c                 @    t          |           t          |           z  S r9   )r6   r;   r3   s    r5   outer_multiplerA   '   s    88d1ggr7   c                      d S r9   r2   r2   r7   r5   	__dummy__rC   *   s    
Fr7   Fanalysis_onlymutates_CFGc                       e Zd ZdZd Zd ZdS )InlineTestPassinline_test_passc                 .    t          j        |            d S r9   r*   __init__selfs    r5   rL   zInlineTestPass.__init__2   s    d#####r7   c                    t          |j        j                  dk    sJ t          |j        j                                                  d         }t          |j                  D ]Y\  }}t          t          |j        |j	                  4t          |j        i ||d |j        |j        d|j        |j        
  
          nZt          j        |j                  }|                                 |                                 dS )Nr1   r   c                      d S r9   r2   r2   r7   r5   <lambda>z)InlineTestPass.run_pass.<locals>.<lambda>;   s     r7   r2   T)lenfunc_irblockslistvalues	enumeratebodyr   r   valuer   	typingctx	targetctxtypemap	calltypesr   PostProcessorrunremove_dels)rN   stateblockistmt	post_procs         r5   run_passzInlineTestPass.run_pass5   s    5='((A----U])002233A6 ,, 	 	GAt]5=$*==I#EM2ua$)OU_b$)M5?D D D 	 J *5=99	tr7   N__name__
__module____qualname___namerL   rf   r2   r7   r5   rH   rH   .   s7        E$ $ $    r7   rH   c                 Z   d}t          |          }|                    t          d           |                    t          d           |                    t          d           |                    t
          d           | j        j        sQ|                    t          d           |                    t          d           |                    t          d           |                    t          d	           |                    t          d
           | j        j        j        r|                    t          d           | j        j        s|                    t           d           | j        j        j        rQ|                    t"          d           |                    t$          d           |                    t&          d           |                    |d           |                    t(          d           |                    t*          d           |                    t,          d           | j        j        j        r|                    t.          d           n|                    t0          d           |                    t2          d           |                    t4          d           |S )Ninline_testzanalyzing bytecodezfix up argszprocessing IRzHandle with contextsznopython rewriteszrewrite semantic constantszdead branch pruningz(inline calls to locally defined closuresznopython frontendzPreprocessing for parforszconvert to parforszfuse parforszparfor preloweringzinline testz$ensure IR is legal prior to loweringzannotate typeszpreserve IRznative parfor loweringznative loweringznopython mode backendzdump parfor diagnostics)r+   add_passr   r   r   r   flagsno_rewritesr   r   r   r   r   auto_parallelenabledr!   r    r"   r(   r)   r&   r   r   r%   r$   r'   r#   )ra   	test_passnamepms       r5   gen_pipelinerv   F   sJ   
%';<<<
I}---
L/222
K!7888{& 	@KK)<===KK02NOOOKK)>???
&>	@ 	@ 	@ 	)+>???;$, 	DKK'BCCC{& 	?KK(*=>>>;$, 	EKK
$8999KK(.999KK-/CDDD
I}--- 	N$JKKK
M#3444
J... ;$, 	;KK,.FGGGGKK(9:::
O%<===
)+DEEE	r7   c                       e Zd ZdZd ZdS )InlineTestPipelinez>compiler pipeline for testing inlining after optimization
    c                 d    t          | j        t                    }|                                 |gS r9   )rv   ra   rH   finalize)rN   ru   s     r5   define_pipelinesz#InlineTestPipeline.define_pipeliness   s'    $*n55
tr7   N)rh   ri   rj   __doc__r{   r2   r7   r5   rx   rx   p   s-             r7   rx   c                       e Zd ZdZd Zd Zd Zd Zd Ze	d             Z
e	d             Ze	d	             Ze	d
             ZdS )TestInliningz
    Check that jitted inner functions are inlined into outer functions,
    in nopython mode.
    Note that not all inner functions are guaranteed to be inlined.
    We just trust LLVM's inlining heuristics.
    c                 p    |                     d          }dd                    d |D                       z   S )z4
        Make regexpr to match mangled name
        .z_ZN? c                 8    g | ]}d                      |          S )z\d+{})format).0ps     r5   
<listcomp>z-TestInlining.make_pattern.<locals>.<listcomp>   s$    "E"E"E!8??1#5#5"E"E"Er7   )splitjoin)rN   fullnamepartss      r5   make_patternzTestInlining.make_pattern   s;     s##"E"Eu"E"E"EFFFFr7   c                     |                      |          }|                     t          j        ||          d                    |                     d S )Nzexpected {}msg)r   assertIsNotNoneresearchr   rN   r   textpats       r5   assert_has_patternzTestInlining.assert_has_pattern   s[    ))RYsD11!.!5!5c!:!: 	 	< 	< 	< 	< 	<r7   c                     |                      |          }|                     t          j        ||          d                    |                     d S )Nzunexpected {}r   )r   assertIsNoner   r   r   r   s       r5   assert_not_has_patternz#TestInlining.assert_not_has_pattern   s[    ))")C..-44S99 	 	; 	; 	; 	; 	;r7   c                    t          dd          5  t                      5 } t          t          j        fd          t
                    }d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                      |d          d           |                                }t          }| 	                    d|z  |           | 
                    d|z  |           d S )NDUMP_ASSEMBLYTr-   r1      z%s.outer_simple%s.inner)r   r   r   r	   int32r?   assertPreciseEqualgetvaluerh   r   r   rN   outcfuncasmprefixs        r5   test_inner_functionz TestInlining.test_inner_function   sw   _d33 	I 	I "" Ic:U[NT:::<HHI I I I I I I I I I I I I I I	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	a!,,, llnn 1F :C@@@##J$7=====4   A.+AA.A	A.A	A..A25A2c                     t          dd          5  t                      5 } t          t          j        fd          t
                    }d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                      |d          d           |                                }t          }| 	                    d|z  |           | 
                    d|z  |           | 
                    d|z  |           d S )	Nr   Tr-   r1      z%s.outer_multiplez%s.morer   )r   r   r   r	   r   rA   r   r   rh   r   r   r   s        r5   test_multiple_inner_functionsz*TestInlining.test_multiple_inner_functions   s    _d33 	K 	K "" Kc:U[NT:::>JJK K K K K K K K K K K K K K K	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	a!,,,llnn 3f <cBBB##I$6<<<##J$7=====r   c                     d } t          dt                    |          }t          j        d          }|                      ||           ||                     d S )Nc                 F    t                       |                                 S r9   )rC   sumAs    r5   	test_implz=TestInlining.test_inline_call_after_parfor.<locals>.test_impl   s    KKK5577Nr7   T)parallelpipeline_class
   )r   rx   nparangeassertEqual)rN   r   j_funcr   s       r5   test_inline_call_after_parforz*TestInlining.test_inline_call_after_parfor   sq    	 	 	 Ht4FGGGDMO OIbMM1vvayy11111r7   c           	      P   d }t          j        |          }t          |j                                                  }|D ]6}t          |j                  D ]\  }}t          |t          j	                  rt          |j
        t          j                  rt          t          ||j
                  dk    r|j        |j        j                                     |j
                   t          j                            t          j        |j        d|j                  dd|j                  |_
        |j        |j        j                                     |j
                   t/          |i ||d             n8|                     t3          |j        d                   d           d S )Nc                     | dk    rd}nd}|S )Nr1   r>      r2   r4   bs     r5   r   z=TestInlining.test_inline_update_target_def.<locals>.test_impl   s    AvvHr7   r>   myvar)locr2   c                      dS r=   r2   r2   r7   r5   rQ   z<TestInlining.test_inline_update_target_def.<locals>.<lambda>   s    q r7   r   )r   run_frontendrU   rT   rV   rW   rX   
isinstancer
   AssignrY   Varr   r   _definitionstargetrt   removeExprcallscoper   appendr   r   rR   )rN   r   rS   rT   rb   rc   rd   s          r5   test_inline_update_target_defz*TestInlining.test_inline_update_target_def   ss   	 	 	 '	22gn++--.. 	 	E$UZ00 
 
4tRY// Jtz264R4R !*gtzBBaGG()9:AA$*MMM!#bfU['tx.X.X.XZ\^`bfbj!k!kDJ()9:AA$*MMM'UAyyIIIEW1#677;;;;;r7   c           	         t          dt          j        i          d             fd}t          j        |          }t          |j                                                  }|D ]}t          |j	                  D ]\  }}t          |t          j                  rt          |j        t          j                  r|j        j        dk    rt!          t"          ||j        j                  }t          |t          j        t          j        f          rCt          |j        t*                    r)|j        j        }t/          ||j        |||          \  }	}
 n،|                     d|
v            d S )Nr   )localsc                     | dz   }|S r0   r2   r   s     r5   gz0TestInlining.test_inline_var_dict_ret.<locals>.g   s    AAHr7   c                        d          S r0   r2   )r   s   r5   r   z8TestInlining.test_inline_var_dict_ret.<locals>.test_impl   s    1Q44Kr7   r   )r   r	   float64r   r   rU   rT   rV   rW   rX   r   r
   r   rY   r   opr   r   funcGlobalFreeVarr   py_funcr   __globals__
assertTrue)rN   r   rS   rT   rb   rc   rd   func_defr   _var_mapr   s              @r5   test_inline_var_dict_retz%TestInlining.test_inline_var_dict_ret   sp    
c5=)	*	*	*	 	 
+	*		 	 	 	 	 '	22gn++--.. 	 	E$UZ00 
 
4tRY// 	&tz27;;	 JMV33$^WdjoNNH"8bi-DEE  *8>= I I"*."8%8#W%8%G&M &M
7w'''''r7   c                 n   t           dd            dfd	}t          dd           G fddt                                 G fdd	t          j                  } t          |
          |          }d}|                      ||           ||                     |                      |             |                       |j        t          j        d           f         j	        d         }t          |j                  |_        |                     t          |j                  d           d S )Nc                     | dS | S r=   r2   r   s    r5   fooz9TestInlining.test_inline_call_branch_pruning.<locals>.foo   s    yqr7   c                      |           S r9   r2   )r   r   s    r5   r   z?TestInlining.test_inline_call_branch_pruning.<locals>.test_impl   s    3q66Mr7   FTrD   c                   $    e Zd ZdZd Z fdZdS )KTestInlining.test_inline_call_branch_pruning.<locals>.PruningInlineTestPasspruning_inline_test_passc                 .    t          j        |            d S r9   rK   rM   s    r5   rL   zTTestInlining.test_inline_call_branch_pruning.<locals>.PruningInlineTestPass.__init__  s    %d+++++r7   c                    t          |j        j                  dk    sJ t          |j        j                                                  d         }t          |j                  D ]\  }}t          t          |j        |j	                  	 Yt          |j        i ||j        |j        |j        |j        |j	        j        d         j                 f|j        |j        
  
          ndS )Nr1   r   T)rR   rS   rT   rU   rV   rW   rX   r   r   rY   r   r   rZ   r[   r\   argsrt   r]   )rN   ra   rb   rc   rd   r   s        r5   rf   zTTestInlining.test_inline_call_branch_pruning.<locals>.PruningInlineTestPass.run_pass  s    5=/00A5555U]188::;;A>(44  GAtmU]DJGG#'(+EM2uaK%/"]4:?1+=+BCE"]EO= = = ( tr7   Nrg   )r   s   r5   PruningInlineTestPassr      sB        .E, , ,      r7   r   c                       e Zd Z fdZdS )MTestInlining.test_inline_call_branch_pruning.<locals>.InlineTestPipelinePrunec                 \    t          | j                  }|                                 |gS r9   )rv   ra   rz   )rN   ru   r   s     r5   r{   z^TestInlining.test_inline_call_branch_pruning.<locals>.InlineTestPipelinePrune.define_pipelines  s)    !$*.CDDtr7   N)rh   ri   rj   r{   )r   s   r5   InlineTestPipelinePruner     s.              r7   r   )r   r   preserved_irr1   r9   )r   r,   r*   r   CompilerBaser   	overloadsr	   Omittedmetadatar   rT   rR   )rN   r   r   r   r   firr   r   s         @@r5   test_inline_call_branch_pruningz,TestInlining.test_inline_call_branch_pruning   s    
	 	 	 
		 	 	 	 	 	 
U	=	=	=	 	 	 	 	 	 	L 	 	 
>	=	(	 	 	 	 	 	 	h&; 	 	 	 >%<===iHH1vvayy111ffhh/// d 3 356?O!#*--
SZ!,,,,,r7   N)rh   ri   rj   r|   r   r   r   r   r   r   r   r   r   r   r2   r7   r5   r~   r~   x   s         G G G< < <
; ; ;

> 
> 
>> > > 	2 	2 	2 < < <4 ( ( (8 2- 2- 2- 2- 2-r7   r~   __main__)Dr   numpyr   numba.tests.supportr   r   r   r   numbar   r   
numba.corer	   r
   r   r   numba.core.ir_utilsr   r   r   r   r   numba.core.registryr   numba.core.inline_closurecallr   numba.core.untyped_passesr   r   r   r   r   r   r   r   r   r   numba.core.typed_passesr   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   numba.core.compiler_machineryr*   r+   r,   unittestr   r6   r;   r?   rA   rC   rH   rv   r   rx   r~   rh   mainr2   r7   r5   <module>r      s   				    0 0 0 0 0 0 0 0 0 0 0 0         4 4 4 4 4 4 4 4 4 4 4 4? ? ? ? ? ? ? ? ? ? ? ? ? ? - - - - - - = = = = = =J J J J J J J J J J J J J J J J J J J J J J J J
D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D S R R R R R R R R R ek^d###  $# ek^d###  $#        U555    \   65.( ( (T    .   j- j- j- j- j-8 j- j- j-X zHMOOOOO r7   