Sean Buckheister
2012-Mar-30 04:20 UTC
[LLVMdev] Invalid code generated for on-stack class compares
clang++ generates invalid code for on-stack struct compares with overloaded operators in release 3.0. Take the following code: struct A { bool operator<(const A& other) { return ((long long int)this) < ((long long int)&other); } }; int main() { A a, b; return (a < b) + (b < a); } Usually, this program should return 1. Compiling it with "clang++ -Ox" with x > 1, it returns 2. The online demo shows this nicely, too: define i32 @main() nounwind uwtable readnone { ret i32 2 } This is apparently fixed in SVN, but it does kind of hurt. As far as I can tell, this hits everything that is a value on the current stack frame. Things behind pointers or references and locations off the stack are safe. Adding an empty destructor to A fixes this problem for -O[123], but -O4 breaks again. This puzzles me, and I wonder: what else does this affect? Is some bug responsible that might as well break completely unrelated pieces of code?
Maybe Matching Threads
- c++ programs type name changed in llvm ir after linking
- [LLVMdev] annotations preventing optimizations/cleanup?
- [LLVMdev] annotations preventing optimizations/cleanup?
- [LLVMdev] [cfe-dev] no-alias generated as result of restrict function arguments
- [LLVMdev] simple optimization question