Hi, Consider this test-case: ... struct ps { int *__restrict__ p; }; f (struct ps &__restrict__ ps1) { *(ps1.p) = 1; } ... Atm (meaning after the fix for PR67666) for this test-case, we register two clique/base annotations, one for the load of pointer ps1.p and one for the store to that pointer: ... void f(ps&) (struct psD.2252 & restrict ps1D.2255) { intD.9 * _3; # VUSE <.MEM_1(D)> # PT = { D.2262 } (nonlocal) _3 = MEM[(struct psD.2252 &)ps1_2(D) clique 1 base 1].pD.2254; # .MEM_4 = VDEF <.MEM_1(D)> MEM[(intD.9 *)_3 clique 1 base 2] = 1; ... If we rewrite the test-case by replacing the struct with its only field, we get: ... f (int *__restrict__ &__restrict__ p) { *p = 1; } ... However, in this case, we register only one clique/base annotation, for the load of pointer p, but not for the store to pointer p: ... void f(int* __restrict__&) (intD.9 * restrict & restrict pD.2255) { intD.9 * _3; # VUSE <.MEM_1(D)> # PT = nonlocal escaped _3 = MEM[(intD.9 * restrict &)p_2(D) clique 1 base 1]; # .MEM_4 = VDEF <.MEM_1(D)> *_3 = 1; ... This patch makes sure we register both clique/base annotations for the the second example. Bootstrapped and reg-tested on x86_64. OK for trunk? Thanks, - Tom