2013/11/6 Richard Biener <richard.guent...@gmail.com>:
> 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.

This example just demonstrates the issue. I may use some var's address
in comparison with the similar result. And value does not always allow
to determine bounds, because pointers with the same value may have
different bounds.

>
> 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.

Target is responsible for having return slot optimization here. And
target expands all such calls. So, do not see the problem here.

Ilya

>
> Richard.
>
>> Ilya
>>>
>>> Richard.
>>>

Reply via email to