You can see May-alias with %1 and @c. It seems if pointer operand points
double pointer or more level pointer, alias analysis can not go through
it. There are some options or ways to avoid May-alias for above case? It
is not easy to find them. If I missed something, please let me know.

That doesn't help... the compiler still can't prove whether some other
translation unit modifies buf.

If you declare buf as `char *const buf[4] = {subbuf1, subbuf2, subbuf3,
subbuf4};`, then I guess you could prove that the pointers in buf don't
point to c. But that's a rare pattern in practice, and it would be kind
of expensive to analyze in BasicAA. Maybe if we add stateful AA to LLVM
eventually.

That doesn't help... the compiler still can't prove whether some other translation unit modifies buf.

If you declare buf as `char *const buf[4] = {subbuf1, subbuf2, subbuf3, subbuf4};`, then I guess you could prove that the pointers in buf don't point to c. But that's a rare pattern in practice, and it would be kind of expensive to analyze in BasicAA. Maybe if we add stateful AA to LLVM eventually.