U
    zhf                     @   sf   d dl Z d dlZd dlZd dlmZ ddlmZ ddlmZ dd Z	dd	 Z
d
d ZedddZdS )    N)ValueRanges   )LoopBody)dominated_nodesc                 C   s   t | ddrdS t| tjrD| js&t| js2| jr<t| } nt	| } t| t	r^| dko\| dkS t| trt
t
j}| |jko| |jkS td|  d S )N
is_BooleanFTi   i   zUnexpected value )getattr
isinstancesympyExprZ	is_numberAssertionErrorZ
is_Integerr   intfloattorchiinfoint32maxmin	TypeError)valr    r   S/var/www/html/venv/lib/python3.8/site-packages/torch/_inductor/optimize_indexing.pyval_expressable_in_32_bits   s    



r   c                 C   s   t | jot | jS )N)r   lowerupper)ranger   r   r   range_expressable_in_32_bits"   s    r   c                 C   s   dd }t | g|D ]}|jdkr$qt|jtrd|jkrt|jtdd  }|| }| D ]f\}	}
||
jkr`||	 }t	|j
st	|jr  d S ttj t|j
t|j}t|s`  d S q`t|| s d S qt| j}tj|d< t|| _d S )Nc                 S   s$   | j dko"| jd tjtjtjfkS )Nto_dtype   )targetargsr   r   Zfloat32Zfloat64)noder   r   r   skip_filter,   s
    z,try_to_reduce_precision.<locals>.skip_filter)storeoutputZset_indirectr   )r   r   r   strr   lenitemsZfree_symbolsmathisinfr   r   r   r	   r
   r   listr   r   r   tuple)r    boundsindirect_varsindicesreplacement_valsr!   Z	dominatedidxZindirect_varindexexprZ	index_valZindex_val_intr   r   r   r   try_to_reduce_precision(   s.    


 


r2   )	loop_bodyc                    sR   |     fdd|  D }|s&dS   }|D ]}t||| j| j j q2dS )z|
    Performs Value Range Analysis on LoopBody's fx graph to reduce precision of
    intermediaries from int64 to int32
    c                    s4   g | ],}|j d kr|jd tjkr| jkr|qS )r   r   )r   r   r   Zint64Zunbounded_vars).0r    Zbvr   r   
<listcomp>`   s
   

z5indexing_dtype_strength_reduction.<locals>.<listcomp>N)r+   Z	get_nodesZ
get_boundsr2   r,   Zindexing_exprsr.   )r3   Zint64_dtype_nodesr+   r    r   r5   r   !indexing_dtype_strength_reductionY   s    
	r7   )r'   r	   r   Ztorch.utils._sympy.value_rangesr   Zirr   utilsr   r   r   r2   r7   r   r   r   r   <module>   s   1