[LLVMdev] Illegal Optimization(?): Combining empty type instances
Chris Lattner
sabre at nondot.org
Tue Nov 1 16:01:01 PST 2005
On Tue, 1 Nov 2005, Evan Jones wrote:
> I think I may have found an illegal optimization in LLVM. The problem is that
> if you have an empty type LLVM optimizes it away so it produces weird
> results. The assembler output from llvm-gcc clearly outputs the "alloca"
> instructions, so some other pass is removing them. I doubt if any real
> program relies on this behaviour, and there is a trivial work around.
> However, my program ran across this problem, so maybe it should be corrected.
>
> The expected output is that all four pointers will be unique and valid. With
Uniqueness is something guaranteed by C++, but not by C. In C, empty
structures have size = 0, which gives you funny cases like this. Consider
the following:
struct Empty {};
struct Empty Foo[10];
The size of both 'Empty' and 'Foo' are zero, which means that each element
of Foo is at the same address.
In the C++ world, this sort of thing is explicitly banned: the smallest
structure you can get with standard C++ is one byte.
> This caused a problem in my program because I was testing if the two
> addresses were equal, and the test was always returning true. The workaround
> is to put something in the structure so that LLVM doesn't optimize it away.
> The question is what does the C standard require?
I believe that LLVM's behavior is correct in this case.
> I'm assuming that GCC is doing the right thing, but I could be wrong.
GCC may well be doing what you expect in this case, but that may just be a
side effect of it not optimizing as aggressively.
-Chris
--
http://nondot.org/sabre/
http://llvm.org/
More information about the llvm-dev
mailing list