Herman Geza wrote:
void foo(float *a) {
int *b = (int*)a; // type-punning warning
// here, access to a and b shouldn't be optimized, as the compiler
knows that a and b point to the same address
}
Is this reasonable?
Even if it were trivial to implement, I would vote against it, because
it would encourage people to write non-compliant code.
In terms of compilation time, it is not reasonable: the standard is
clear about this so that compilers can optimize based on declared types,
without having to perform overly complex (and expensive) alias analysis.
For the corner case where you have non-compliant code that breaks with
-fstrict-aliasing and is much slower with -fno-strict-aliasing, and
which you cannot modify, I think you are on your own. You could in
principle write a pass that flags all the possible references (including
possible aliases) to potentially type-punned addresses. Then you would
have to make sure that this information is understood by the relevant
optimization passes, and that it is preserved across different
representations, i.e., from GIMPLE to RTL. All this work just to fight
the standard :).