On Tue, Nov 5, 2013 at 3:24 PM, Ilya Enkovich <enkovich....@gmail.com> wrote:
> 2013/11/5 Richard Biener <richard.guent...@gmail.com>:
>> On Tue, Nov 5, 2013 at 1:52 PM, Ilya Enkovich <enkovich....@gmail.com> wrote:
>>>
>>> For input parameter P I need to have
>>>   BOUNDS = __builtin_arg_bnd (P)
>>> to somehow refer to bounds of P in GIMPLE.  Optimizations may modify
>>> __builtin_arg_bnd (P) replacing P with its copy or some value. It
>>> makes call useless because removes information about parameter whose
>>> bounds we refer to. I want such optimization to ignore
>>> __builtin_arg_bnd calls and always leave default SSA_NAME of PARM_DECL
>>> there as arg.
>>
>> How does a compilable testcase look like that shows how the default def
>> is used?  And what transforms break that use?  I really cannot see
>> how this would happen (and you didn't add a testcase).
>
> Here is a test source:
>
> extern int bar1 (int *p);
> extern int bar2 (int);
>
> int foo (int *p)
> {
>   if (!p)
>     return bar1 (p);
>   return bar2 (10);
> }
>
> After instrumentation GIMPLE looks like:
>
> foo (int * p)
> {
>   <unnamed type> __bound_tmp.0;
>   int _1;
>   int _6;
>   int _8;
>
>   <bb 6>:
>   __bound_tmp.0_9 = __builtin_ia32_arg_bnd (p_3(D));
>
>   <bb 2>:
>   if (p_3(D) == 0B)
>     goto <bb 3>;
>   else
>     goto <bb 4>;
>
>   <bb 3>:
>   _6 = bar1 (p_3(D), __bound_tmp.0_9);
>   goto <bb 5>;
>
>   <bb 4>:
>   _8 = bar2 (10);
>
>   <bb 5>:
>   # _1 = PHI <_6(3), _8(4)>
>   return _1;
>
> }
>
> Here is optimized GIMPLE (if I do not apply my changes in tree-ssa-dom.c):
>
> foo (int * p)
> {
>   <unnamed type> __bound_tmp.0;
>   int _1;
>   int _6;
>   int _8;
>
>   <bb 2>:
>   if (p_3(D) == 0B)
>     goto <bb 3>;
>   else
>     goto <bb 4>;
>
>   <bb 3>:
>   __bound_tmp.0_9 = __builtin_ia32_arg_bnd (0B); [return slot optimization]
>   _6 = bar1 (0B, __bound_tmp.0_9); [tail call]
>   goto <bb 5>;
>
>   <bb 4>:
>   _8 = bar2 (10); [tail call]
>
>   <bb 5>:
>   # _1 = PHI <_6(3), _8(4)>
>   return _1;
>
> }
>
> Now during expand or inline of foo I cannot determine the value for
> __bound_tmp.0_9.

Well, but clearly you can see that bounds for p == NULL are
useless and thus there is no problem with the transform.

Also sth weird is going on as your arg_bnd call gets [return slot optimization].
It seems that your POINTER_BOUNDS_TYPE is seen as aggregate somehow.

Richard.

> Ilya
>>
>> Richard.
>>

Reply via email to