
    J/Ph -                        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 e5dd           G d de3                      Z7d Z8 G d dej9                  Z: G d de          Z;e<dk    r e6j=                     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_passFTanalysis_onlymutates_CFGc                       e Zd ZdZd Zd ZdS )InlineTestPassinline_test_passc                 .    t          j        |            d S Nr*   __init__selfs    Y/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/numba/tests/test_inlining.pyr6   zInlineTestPass.__init__    s    d#####    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 )N   r   c                      d S r4    r>   r:   r9   <lambda>z)InlineTestPass.run_pass.<locals>.<lambda>)   s     r:   r>   T)lenfunc_irblockslistvalues	enumeratebodyr   r   valuer   	typingctx	targetctxtypemap	calltypesr   PostProcessorrunremove_dels)r8   stateblockistmt	post_procs         r9   run_passzInlineTestPass.run_pass#   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	tr:   N__name__
__module____qualname___namer6   rT   r>   r:   r9   r1   r1      s7        E$ $ $    r:   r1   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#   )rO   	test_passnamepms       r9   gen_pipelinerd   4   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	r:   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 r4   )rd   rO   r1   finalize)r8   rc   s     r9   define_pipelinesz#InlineTestPipeline.define_pipelinesa   s'    $*n55
tr:   N)rV   rW   rX   __doc__ri   r>   r:   r9   rf   rf   ^   s-             r:   rf   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     r9   
<listcomp>z-TestInlining.make_pattern.<locals>.<listcomp>s   s$    "E"E"E!8??1#5#5"E"E"Er:   )splitjoin)r8   fullnamepartss      r9   make_patternzTestInlining.make_patternn   s;     s##"E"Eu"E"E"EFFFFr:   c                     |                      |          }|                     t          j        ||          d                    |                     d S )Nzexpected {}msg)ry   assertIsNotNoneresearchrq   r8   rw   textpats       r9   assert_has_patternzTestInlining.assert_has_patternu   s[    ))RYsD11!.!5!5c!:!: 	 	< 	< 	< 	< 	<r:   c                     |                      |          }|                     t          j        ||          d                    |                     d S )Nzunexpected {}r{   )ry   assertIsNoner~   r   rq   r   s       r9   assert_not_has_patternz#TestInlining.assert_not_has_patternz   s[    ))")C..-44S99 	 	; 	; 	; 	; 	;r:   c                    ddl m}m} t          dd          5  t	                      5 } t          t          j        fd          |          }d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                      |d          d           |	                                }| 
                    d|z  |           |                     d	|z  |           d S )
Nr   )outer_simplerV   DUMP_ASSEMBLYTnopythonr<      z%s.outer_simple%s.inner)numba.tests.inlining_usecasesr   rV   r   r   r   r	   int32assertPreciseEqualgetvaluer   r   )r8   r   prefixoutcfuncasms         r9   test_inner_functionz TestInlining.test_inner_function   s   	 	 	 	 	 	 	 	 _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   A1&AA1A	A1!A	"A11A58A5c                    ddl m}m} t          dd          5  t	                      5 } t          t          j        fd          |          }d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                      |d          d           |	                                }| 
                    d|z  |           |                     d	|z  |           |                     d
|z  |           d S )Nr   )outer_multiplerV   r   Tr   r<      z%s.outer_multiplez%s.morer   )r   r   rV   r   r   r   r	   r   r   r   r   r   )r8   r   r   r   r   r   s         r9   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dl m fd} t          dt                    |          }t	          j        d          }|                      ||           ||                     d S )Nr   )	__dummy__c                 @                  |                                  S r4   )sum)Ar   s    r9   	test_implz=TestInlining.test_inline_call_after_parfor.<locals>.test_impl   s    IKKK5577Nr:   T)parallelpipeline_class
   )r   r   r   rf   nparangeassertEqual)r8   r   j_funcr   r   s       @r9   test_inline_call_after_parforz*TestInlining.test_inline_call_after_parfor   s    ;;;;;;	 	 	 	 	 Ht4FGGGDMO OIbMM1vvayy11111r:   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 )Nr<         r>   abs     r9   r   z=TestInlining.test_inline_update_target_def.<locals>.test_impl   s    AvvHr:   r   myvar)locr>   c                      dS Nr   r>   r>   r:   r9   r?   z<TestInlining.test_inline_update_target_def.<locals>.<lambda>   s    q r:   r   )r   run_frontendrC   rB   rD   rE   rF   
isinstancer
   AssignrG   Varr   r   _definitionstargetrb   removeExprcallscoper   appendr   r   r@   )r8   r   rA   rB   rP   rQ   rR   s          r9   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;;;;;r:   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 Nr<   r>   r   s     r9   gz0TestInlining.test_inline_var_dict_ret.<locals>.g   s    AAHr:   c                        d          S r   r>   )r   s   r9   r   z8TestInlining.test_inline_var_dict_ret.<locals>.test_impl   s    1Q44Kr:   r   )r   r	   float64r   r   rC   rB   rD   rE   rF   r   r
   r   rG   r   opr   r   funcGlobalFreeVarr   py_funcr   __globals__
assertTrue)r8   r   rA   rB   rP   rQ   rR   func_defr   _var_mapr   s              @r9   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'''''r:   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   r>   )r   s    r9   fooz9TestInlining.test_inline_call_branch_pruning.<locals>.foo   s    yqr:   c                      |           S r4   r>   )r   r   s    r9   r   z?TestInlining.test_inline_call_branch_pruning.<locals>.test_impl   s    3q66Mr:   FTr-   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 r4   r5   r7   s    r9   r6   zTTestInlining.test_inline_call_branch_pruning.<locals>.PruningInlineTestPass.__init__   s    %d+++++r:   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 )Nr<   r   T)r@   rA   rB   rC   rD   rE   rF   r   r   rG   r   r   rH   rI   rJ   argsrb   rK   )r8   rO   rP   rQ   rR   r   s        r9   rT   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= = = ( tr:   NrU   )r   s   r9   PruningInlineTestPassr      sB        .E, , ,      r:   r   c                       e Zd Z fdZdS )MTestInlining.test_inline_call_branch_pruning.<locals>.InlineTestPipelinePrunec                 \    t          | j                  }|                                 |gS r4   )rd   rO   rh   )r8   rc   r   s     r9   ri   z^TestInlining.test_inline_call_branch_pruning.<locals>.InlineTestPipelinePrune.define_pipelines  s)    !$*.CDDtr:   N)rV   rW   rX   ri   )r   s   r9   InlineTestPipelinePruner     s.              r:   r   )r   r   preserved_irr<   r4   )r   r,   r*   r   CompilerBaser   	overloadsr	   Omittedmetadatar   rB   r@   )r8   r   r   r   r   firr   r   s         @@r9   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!,,,,,r:   N)rV   rW   rX   rj   ry   r   r   r   r   r   r   r   r   r   r>   r:   r9   rl   rl   f   s         G G G< < <
; ; ;
> > >> > > 
2 
2 
2 < < <4 ( ( (8 2- 2- 2- 2- 2-r:   rl   __main__)>r~   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,   unittestr1   rd   r   rf   rl   rV   mainr>   r:   r9   <module>r      sD   				    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 U555    \   65.( ( (T    .   n- n- n- n- n-8 n- n- n-` zHMOOOOO r:   