// David Li The issue is known and being worked on. File this bug report just to track the problem.
One of the rules that can be derived from the basic rules is that if two access's base types are the same, access offset and size can be used to determine the overlapping relationships of the two accesses. This is currently not handled in GCC -- most likely an implementation issue. Example 38: struct BUF1 { int b1; int b12; }; int foo(int n, struct BUF1* p, struct BUF1* q) { int i = 0; for (i = 0; i < n; i++) { p->b1 += q->b12; // Two accesses are not aliased with strict aliasing } return 0; } The loop should be transformed into: t1 = p->b1; t2 = q->b12; for (...) { t1 += t2; } p->b1= t1; The ansi rule can also be extended to handle cases where one type is nested within another one. Example 39: struct BUF1 { int b1; int b12; }; struct BUF2 { int b2; int g; struct BUF1 bf1; }; int foo(int n, struct BUF1* p, struct BUF2* q) { int i = 0; for (i = 0; i < n; i++) { p->b1 += q->b2; } return 0; } -- Summary: Ansi aliasing info not fully utilized by tree SSA optimizations Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: middle-end AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: xinliangli at gmail dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35358