Am Freitag, dem 03.11.2023 um 07:22 +0100 schrieb Jakub Jelinek: > On Fri, Nov 03, 2023 at 07:07:36AM +0100, Martin Uecker wrote: > > Am Donnerstag, dem 02.11.2023 um 17:28 -0700 schrieb Bill Wendling: > > > On Thu, Nov 2, 2023 at 1:36 PM Qing Zhao <qing.z...@oracle.com> wrote: > > > > > > > > Thanks a lot for raising these issues. > > > > > > > > If I understand correctly, the major question we need to answer is: > > > > > > > > For the following example: (Jakub mentioned this in an early message) > > > > > > > > 1 struct S { int a; char b __attribute__((counted_by (a))) []; }; > > > > 2 struct S s; > > > > 3 s.a = 5; > > > > 4 char *p = &s.b[2]; > > > > 5 int i1 = __builtin_dynamic_object_size (p, 0); > > > > 6 s.a = 3; > > > > 7 int i2 = __builtin_dynamic_object_size (p, 0); > > > > > > > > Should the 2nd __bdos call (line 7) get > > > > A. the latest value of s.a (line 6) for it’s size? > > > > Or B. the value when the s.b was referenced (line 3, line 4)? > > > > > > > I personally think it should be (A). The user is specifically > > > indicating that the size has somehow changed, and the compiler should > > > behave accordingly. > > > > > > One potential problem for A apart from the potential impact on > > optimization is that the information may get lost more > > easily. Consider: > > > > char *p = &s.b[2]; > > f(&s); > > int i = __bdos(p, 0); > > > > If the compiler can not see into 'f', the information is lost > > because f may have changed the size. > > Why? It doesn't really matter. The options are > A. p is at &s.b[2] associated with &s.a and int type (or size of int > or whatever); .ACCESS_WITH_SIZE can't be pure, but sure, for aliasing > POV we can describe it with more detail that it doesn't modify anything > in the pointed structure, just escapes the pointer; __bdos can stay > leaf I believe; and when expanding __bdos later on, it would just > dereference the associated pointer at that point (note, __bdos is > pure, so it has vuse but not vdef and can load from memory); if > f changes s.a, no problem, __bdos will load the changed value in there
Ah, I right. Because of the reload it doesn't matter. Thank you for the explanation! Martin > B. if .ACCESS_WITH_SIZE associates the pointer with the s.a value from that > point, .ACCESS_WITH_SIZE can be const, but obviously if f changes s.a, > __bdos later will use s.a value from the &s.b[2] spot