o
    Ih'                     @   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Expr	is_number
is_Integerr	   intfloattorchiinfoint32maxmin	TypeError)r   r    r   U/var/www/vscode/kcb/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   float32float64)r   r   r   r   skip_filter3   s
   z,try_to_reduce_precision.<locals>.skip_filter)storeoutputset_indirectr%   )r   boolr   r&   r   strr   lenitemsfree_symbolsmathisinfr   r   r   r   r   r   listr'   r   r   tuple)r   r    r!   r"   r#   r*   	dominatedidxindirect_varindexexpr	index_valindex_val_intr'   r   r   r   try_to_reduce_precision)   s0   





r>   	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   int64unbounded_vars).0r   bvr   r   
<listcomp>g   s    

z5indexing_dtype_strength_reduction.<locals>.<listcomp>N)r    	get_nodes
get_boundsr>   r!   indexing_exprsr#   )r?   int64_dtype_nodesr    r   r   rC   r   !indexing_dtype_strength_reduction`   s    
	rJ   )r3   typingr   r   r   torch.utils._sympy.value_rangesr   r?   r   utilsr   r.   r   r   r   dictr5   r>   rJ   r   r   r   r   <module>   s.    

7