On Fri, 31 Jan 2020, Bin.Cheng wrote:

> Hi,
> In tree.c:build2 there is following code/comment:
> 
>   if ((code == MINUS_EXPR || code == PLUS_EXPR || code == MULT_EXPR)
>       && arg0 && arg1 && tt && POINTER_TYPE_P (tt)
>       /* When sizetype precision doesn't match that of pointers
>          we need to be able to build explicit extensions or truncations
>          of the offset argument.  */
>       && TYPE_PRECISION (sizetype) == TYPE_PRECISION (tt))
>     gcc_assert (TREE_CODE (arg0) == INTEGER_CST
>                 && TREE_CODE (arg1) == INTEGER_CST);
> 
> The comment says specific condition needs to be satisfied if sizetype
> precision doesn't match that of pointers, while the code is checking
> "==" of precisions?  Any explanation?

On targets where sizetype mode != ptr_mode the assert fires for reasons
I do not remember.  The comment is a bit confusing since we're
dealing with plus/minus/mult here, not truncations or extensions
also the assert will still allow to-be-constant-folded values
(guess fold-const.c doesn't honor the restrictions).

In reality minus/plus/mult should never be used on pointers.

Richard.

Reply via email to