
    xKg -                        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jr                        Z: G d de      Z;e<dk(  r e6jz                          yy)    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y)InlineTestPassinline_test_passc                 .    t        j                  |        y Nr*   __init__selfs    ]/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/numba/tests/test_inlining.pyr6   zInlineTestPass.__init__    s    d#    c                 @   t        |j                  j                        dk(  sJ t        |j                  j                  j	                               d   }t        |j                        D ]s  \  }}t        t        |j                  |j                        ,t        |j                  i ||d |j                  |j                  d|j                  |j                  
        n t        j                   |j                        }|j#                          |j%                          y)N   r   c                       y 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3A6 ,GAt]5==$**=I#EMM2ua$)OOU__b$)MM5??D  - **5==9	r:   N__name__
__module____qualname___namer6   rT   r>   r:   r9   r1   r1      s    E$r:   r1   c                    d}t        |      }|j                  t        d       |j                  t        d       |j                  t        d       |j                  t
        d       | j                  j                  sB|j                  t        d       |j                  t        d       |j                  t        d       |j                  t        d	       |j                  t        d
       | j                  j                  j                  r|j                  t        d       | j                  j                  s|j                  t         d       | j                  j                  j                  rB|j                  t"        d       |j                  t$        d       |j                  t&        d       |j                  |d       |j                  t(        d       |j                  t*        d       |j                  t,        d       | j                  j                  j                  r|j                  t.        d       n|j                  t0        d       |j                  t2        d       |j                  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   s   
%';<
I}-
L/2
K!78{{&&KK)<=KK02NOKK)>?
&>	@ 	)+>?;;$$,,KK'BC{{&&KK(*=>;;$$,,KK
$89KK(.9KK-/CD
I}- 	N$JK
M#34
J. ;;$$,,KK,.FGKK(9:
O%<=
)+DE	r:   c                       e Zd ZdZd Zy)InlineTestPipelinez>compiler pipeline for testing inlining after optimization
    c                 \    t        | j                  t              }|j                          |gS r4   )rd   rO   r1   finalize)r8   rc   s     r9   define_pipelinesz#InlineTestPipeline.define_pipelinesa   s"    $**n5
tr:   N)rV   rW   rX   __doc__ri   r>   r:   r9   rf   rf   ^   s    r:   rf   c                   n    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y)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           	          |j                  d      }ddj                  |D cg c]  }dj                  |       c}      z   S c c}w )z4
        Make regexpr to match mangled name
        .z_ZN? z\d+{})splitjoinformat)r8   fullnamepartsps       r9   make_patternzTestInlining.make_patternn   sA     s#u"Eu!8??1#5u"EFFF"Es   A
c                     | j                  |      }| j                  t        j                  ||      dj	                  |             y )Nzexpected {}msg)rv   assertIsNotNoneresearchrr   r8   rs   textpats       r9   assert_has_patternzTestInlining.assert_has_patternu   s@    )RYYsD1!.!5!5c!: 	 	<r:   c                     | j                  |      }| j                  t        j                  ||      dj	                  |             y )Nzunexpected {}rx   )rv   assertIsNoner{   r|   rr   r}   s       r9   assert_not_has_patternz#TestInlining.assert_not_has_patternz   s@    )"))C.-44S9 	 	;r:   c                 |   ddl m}m} t        dd      5  t	               5 } t        t        j                  fd      |      }d d d        d d d        | j                   d      d       j                         }| j                  d|z  |       | j                  d	|z  |       y # 1 sw Y   dxY w# 1 sw Y   hxY w)
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 "c:U[[NT:<H # 4 	a!, lln 1F :C@##J$7= #" 43s"   B2#B&B2&B/	+B22B;c                    ddl m}m} t        dd      5  t	               5 } t        t        j                  fd      |      }d d d        d d d        | j                   d      d       j                         }| j                  d|z  |       | j                  d	|z  |       | j                  d
|z  |       y # 1 sw Y   yxY w# 1 sw Y   }xY w)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 "c:U[[NT:>J # 4 	a!,lln 3f <cB##I$6<##J$7= #" 43s"   C#B;C;C	 CCc                     ddl m fd} t        dt              |      }t	        j
                  d      }| j                   ||       ||             y )Nr   )	__dummy__c                 2             | j                         S r4   )sum)Ar   s    r9   	test_implz=TestInlining.test_inline_call_after_parfor.<locals>.test_impl   s    K557Nr:   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   sK    ;	 Ht4FGDMOIIbM1vay1r:   c           	         d }t        j                  |      }t        |j                  j	                               }|D ]e  }t        |j                        D ]I  \  }}t        |t        j                        s"t        |j                  t        j                        sGt        t        ||j                        dk(  sf|j                  |j                  j                      j#                  |j                         t        j$                  j'                  t        j                  |j(                  d|j*                        dd|j*                        |_
        |j                  |j                  j                      j-                  |j                         t/        |i ||d         e h | j1                  t3        |j                  d         d       y )Nc                     | dk(  rd}|S d}|S )Nr<         r>   abs     r9   r   z=TestInlining.test_inline_update_target_def.<locals>.test_impl   s!    Av H Hr:   r   myvar)locr>   c                       yNr   r>   r>   r:   r9   r?   z<TestInlining.test_inline_update_target_def.<locals>.<lambda>   s    qr:   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   s@   	 ''	2gnn++-.E$UZZ04tRYY/Jtzz2664R!*gtzzBaG(()9)9:AA$**M!#bffU[['txx.XZ\^`bfbjbj!kDJ(()9)9:AA$**M'UAyI 1  	W11#67;r:   c           	      (   t        dt        j                  i      d        fd}t        j                  |      }t        |j                  j                               }|D ]  }t        |j                        D ]  \  }}t        |t        j                        s!t        |j                  t        j                        sF|j                  j                  dk(  s`t!        t"        ||j                  j$                        }t        |t        j&                  t        j(                  f      st        |j                  t*              s|j                  j,                  }t/        ||j0                  |||      \  }	}
   | j3                  d
v        y )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    Q4Kr:   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   s#    
c5==)	*	 
+		 ''	2gnn++-.E$UZZ04tRYY/&tzz277; JJMMV3$^WdjjooNH"8bii-DE *8>>= I"*.."8"8%8#W%8%8%G&M
7 1  	w'r:   c                     t         dd       dfd	}t        dd       G fddt                      G fdd	t        j                        } t        |
      |      }d}| j                   ||       ||             | j                   |        |              |j                  t        j                  d       f   j                  d   }t        |j                        |_        | j                  t        |j                        d       y )Nc                     | y| S r   r>   )r   s    r9   fooz9TestInlining.test_inline_call_branch_pruning.<locals>.foo   s    yr:   c                      |       S r4   r>   )r   r   s    r9   r   z?TestInlining.test_inline_call_branch_pruning.<locals>.test_impl   s    q6Mr:   FTr-   c                   "    e Zd ZdZd Z fdZy)KTestInlining.test_inline_call_branch_pruning.<locals>.PruningInlineTestPasspruning_inline_test_passc                 .    t        j                  |        y r4   r5   r7   s    r9   r6   zTTestInlining.test_inline_call_branch_pruning.<locals>.PruningInlineTestPass.__init__   s    %%d+r:   c                 6   t        |j                  j                        dk(  sJ t        |j                  j                  j	                               d   }t        |j                        D ]  \  }}t        t        |j                  |j                        	 -t        |j                  i ||j                  |j                  |j                  |j                  |j                  j                  d   j                      f|j                  |j"                  
        y y)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==//0A555U]]1188:;A>(4GAtmU]]DJJG#'(+EMM2uaKK%//"]]4::??1+=+B+BCE"]]EOO=   5 r:   NrU   )r   s   r9   PruningInlineTestPassr      s    .E,r:   r   c                       e Zd Z fdZy)MTestInlining.test_inline_call_branch_pruning.<locals>.InlineTestPipelinePrunec                 V    t        | j                        }|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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1vay1fh/ d 356??O!#**-
SZZ!,r:   N)rV   rW   rX   rj   rv   r   r   r   r   r   r   r   r   r   r>   r:   r9   rl   rl   f   sq    G<
;
>> 
2 
2 < <4 ( (8 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      s    	 0 0  4 4? ? - =J J J
D D D D S R U5\  6.(T.. n-8 n-` zHMMO r:   