o
    Zh'                     @   s   d dl Z d dlm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edefd	d
Zdeej defddZdedeeef dee deeejf deeeej f ddfddZdeddfddZdS )    N)Any)ValueRanges   )LoopBody)dominated_nodesvalreturnc                 C   s   t | ddrdS t| tjr"| jsJ | js| jrt| } nt| } t| tr/| dko.| dkS t| trDt	
t	j}| |jkoC| |jkS td|  )N
is_BooleanFTi   i   zUnexpected value )getattr
isinstancesympyExprZ	is_numberZ
is_Integerr	   intfloattorchiinfoint32maxmin	TypeError)r   r    r   P/var/www/auris/lib/python3.10/site-packages/torch/_inductor/optimize_indexing.pyval_expressable_in_32_bits   s   



r   rangec                 C   s   t | jo	t | jS )N)r   lowerupper)r   r   r   r   range_expressable_in_32_bits#   s   r   nodeboundsindirect_varsindicesreplacement_valsc                 C   s  dt dtfdd}t| g|D ]c}|jdv rqt|jtrid|jv rit|jtdd  }|| }| D ]3\}	}
||
j	v rh||	 }t
|jsNt
|jrR  d S ttj t|jt|j}t|sh  d S q5t|| sr d S qt| j}tj|d< t|| _d S )Nr   r   c                 S   s$   | j dko| jd tjtjtjfv S )Nto_dtype   )targetargsr   r   Zfloat32Zfloat64)r   r   r   r   skip_filter3   s
   z,try_to_reduce_precision.<locals>.skip_filter)storeoutputZset_indirectr#   )r   boolr   r$   r   strr   lenitemsZfree_symbolsmathisinfr   r   r   r   r   r   listr%   r   r   tuple)r   r   r   r    r!   r&   Z	dominatedidxZindirect_varindexexprZ	index_valZindex_val_intr%   r   r   r   try_to_reduce_precision)   s0   





r4   	loop_bodyc                    sR   |     fdd|  D }|sdS   }|D ]}t||| j| j j qd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vr|qS )r"   r#   )r$   r%   r   Zint64Zunbounded_vars).0r   Zbvr   r   
<listcomp>g   s    

z5indexing_dtype_strength_reduction.<locals>.<listcomp>N)r   Z	get_nodesZ
get_boundsr4   r   Zindexing_exprsr!   )r5   Zint64_dtype_nodesr   r   r   r7   r   !indexing_dtype_strength_reduction`   s    
	r9   )r-   typingr   r   r   Ztorch.utils._sympy.value_rangesr   r5   r   utilsr   r)   r   r   r   dictr/   r4   r9   r   r   r   r   <module>   s.    

7