> Am 20.10.2023 um 19:09 schrieb Qing Zhao <qing.z...@oracle.com>:
> 
> Sid,
> 
> (Richard, can you please help me to make sure this? Thanks a lot)
> 
> I studied a little bit more on the following question you raised during the 
> review process:
> 
> For the following small testing case: 
> 
>  1 struct annotated {
>  2   int foo;
>  3   char array[] __attribute__((counted_by (foo)));
>  4 };
>  5 
>  6 extern struct annotated * alloc_buf (int);
>  7 
>  8 int test (int sz)
>  9 {
> 10   struct annotated * array_annotated = alloc_buf (sz);
> 11   array_annotated->foo = sz;
> 12   return __builtin_dynamic_object_size (array_annotated->array, 1);
> 13 }
> 
> Whether the assignment of the size to the counted_by field at line 11 and the 
> consumer of the size at line 12 at call to __bdos might be reordered by GCC? 
> 
> The following is my thought:
> 
> 1. _bdos computation passes (both pass_early_object_sizes and 
> pass_object_sizes) are in the early stage of SSA optimizations. In which, 
> pass_early_object_sizes happens before almost all the optimizations, no 
> reordering is possible in this pass;
> 
> 2. Then how about the pass “pass_object_sizes”?
> 
>   Immediately after the pass_build_ssa,  the IR for the routine “test” is  
> with the SSA form: (compiled with -O3):
> 
>  1 int test (int sz)
>  2 {
>  3   struct annotated * array_annotated;
>  4   char[0:] * _1;
>  5   long unsigned int _2;
>  6   int _8;
>  7   
>  8   <bb 2> :
>  9   array_annotated_6 = alloc_buf (sz_4(D));
> 10   array_annotated_6->foo = sz_4(D);
> 11   _1 = &array_annotated_6->array;
> 12   _2 = __builtin_dynamic_object_size (_1, 1);
> 13   _8 = (int) _2;
> 14   return _8; 
> 15 } 
> 
> In the above IR, the key portion is line 10 and line 11: (whether these two 
> lines might be reordered with SSA optimization?)
> 
> 10   array_annotated_6->foo = sz_4(D);
> 11   _1 = &array_annotated_6->array;
> 
> The major question here is: whether the SSA optimizations are able to 
> distinguish the object “array_annotated_6->foo” at line 10 is independent with
> the object “array_annotated-_6->array” at line 11?
> 
> If the SSA optimizations can distinguish “array_annotated_6->foo” from 
> “array_annotated_6->array”, then these two lines might be reordered.
> Otherwise, these two lines will not be reordered by SSA optimizations.
> 
> I am not very familiar with the details of the SSA optimizations, but my 
> guess is, two fields of the same structure might not be distinguished by the 
> SSA optimizations, then line 10 and line 11 will not be reordered by SSA 
> optimizations.
> 
> Richard, is my guess correct?

There is no data dependence between the memory access and the address 
computation so nothing prevents the reordering.  If you put another same bos 
call before the access I expect the addresses to be CSEd, effectively moving 
the later before the access.

Richard 

> Thanks a lot for your help.
> 
> Qing
> 
>>>> On Oct 5, 2023, at 4:08 PM, Siddhesh Poyarekar <siddh...@gotplt.org> wrote:
>>> 
>>> I hope the review was helpful.  Overall, a couple of things to consider:
>>> 
>>> 1. How would you handle potential reordering between assignment of the size 
>>> to the counted_by field with the __bdos call that may consume it? You'll 
>>> probably need to express some kind of dependency there or in the worst 
>>> case, insert a barrier to disallow reordering.
>> 
>> Good point! 
>> 
>> So, your example in the respond to [V3][PATCH 2/3]Use the counted_by 
>> atribute info in builtin object size [PR108896]:
>> “
>> Maybe another test where the allocation, size assignment and __bdos call 
>> happen in the same function, where the allocator is not recognized by gcc:
>> 
>> void *
>> __attribute__ ((noinline))
>> alloc (size_t sz)
>> {
>> return __builtin_malloc (sz);
>> }
>> 
>> void test (size_t sz)
>> {
>> array_annotated = alloc (sz);
>> array_annotated->b = sz;
>> return __builtin_dynamic_object_size (array_annotated->c, 1);
>> }
>> 
>> The interesting thing to test (and ensure in the codegen) is that the 
>> assignment to array_annotated->b does not get reordered to below the 
>> __builtin_dynamic_object_size call since technically there is no data 
>> dependency between the two.
>> “
>> Will test on this. 
>> 
>> Not sure whether the current GCC alias analysis is able to distinguish one 
>> field of a structure from another field of the same structure, if YES, then
>> We need to add an explicit dependency edge from the write to 
>> “array_annotated->b” to the call to 
>> “__builtin_dynamic_object_size(array_annotated->c,1)”.
>> I will check on this and see how to resolve this issue.
>> 
>> I guess the possible solution is that we can add an implicit ref to 
>> “array_annotated->b” at the call to 
>> “__builtin_dynamic_object_size(array_annotated->c, 1)” if the counted_by 
>> attribute is available. That should resolve the issue.
>> 
>> Richard, what do you think on this?
>> 
> 

Reply via email to