On Wed, Nov 6, 2013 at 2:31 PM, Ilya Enkovich <enkovich....@gmail.com> wrote:
> 2013/11/6 Richard Biener <richard.guent...@gmail.com>:
>> On Wed, Nov 6, 2013 at 12:59 PM, Ilya Enkovich <enkovich....@gmail.com> 
>> wrote:
>>> 2013/11/6 Richard Biener <richard.guent...@gmail.com>:
>>>> On Wed, Nov 6, 2013 at 12:00 PM, Ilya Enkovich <enkovich....@gmail.com> 
>>>> wrote:
>>>>> 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.
>>>>
>>>> Some vars address can be used for better bounds deriving though.
>>>> Well, it clearly shows it's a "get me good results" issue and not
>>>> a correctness issue.  And for "good results" you trade in missed
>>>> general optimizations.  That doesn't sound very good to me.
>>>
>>> That is definitely a correctness issue.
>>
>> Then please add a runtime testcase that fails before and passes after
>> your patch.
>>
>>> Compiler cannot assume bounds
>>> by pointer value ignoring bounds passed to the function.
>>
>> But it can certainly drop bounds to "unknown"?  You certainly cannot
>> rely on no such transform taking place.  Maybe this just shows that
>> your "refering to the parameter" is done wrong and shouldn't have
>> used the SSA name default def.  What do you do for parameters
>> that have their address taken btw?  You'll get
>>
>> foo (void *p)
>> {
>>    p_2 = *p;
>>    __builtin_ia32_arg_bnd (p_2);
>>
>> which isn't desired?
>
> In this case you just make a load and bounds for p_2 are obtained
> using bndldx call. I would be glad to use better way to refer to the
> argument but I do not see one.

Err, my mistake - I meant

foo (void *p)
{
  p_2 = p;
  __builtin_ia32_arg_bnd (p_2);

>>
>> Hmm, unfortunately on x86_64 I get
>>
>> ./cc1 -quiet t.c -fcheck-pointer-bounds
>> t.c:1:0: error: -fcheck-pointers is not supported for this target
>>  extern int bar1 (int *p);
>>  ^
>>
>> trying a simple testcase.  Grepping shows me no target supports
>> chkp_bound_mode ..?  What's this stuff in our tree that has no way
>> of testing it ... :/
>
> You should pass -mmpx to enable it on the target. Current version in
> the mpx tree should build most of tests correctly but it is not
> updated to the current state.

> ./cc1 -quiet t.c -fcheck-pointer-bounds -mmpx
t.c:1:0: error: -fcheck-pointers is not supported for this target
 extern int bar1 (int *p);
 ^

hmm, maybe it's configure disabled somehow (this is just my dev tree).
But I still see no chkp_bound_mode implementation.

Note that POINTER_BOUNDS_TYPE shouldn't have been a new
tree code either but should be a RECORD_TYPE.  See how
va_list doesn't use a new TREE_CODE either.

Richard.

> Ilya
>
>>
>> Richard.
>>
>>> SSA_NAME_OCCURS_IN_ABNORMAL_PHI usage results in missed optimizations.
>>>  My original patch does not.
>>>
>>> Ilya
>>>
>>>>
>>>> Richard.
>>>>
>>>>>>
>>>>>> 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