http://llvm.org/bugs/show_bug.cgi?id=22050
Bug ID: 22050
Summary: clang 3.5.0 generates invalid code for the
conditional/ternary operator with -O1 or above in some
cases
Product: clang
Version: 3.5
Hardware: PC
OS: Linux
Status: NEW
Severity: normal
Priority: P
Component: -New Bugs
Assignee: [email protected]
Reporter: [email protected]
CC: [email protected]
Classification: Unclassified
Created attachment 13602
--> http://llvm.org/bugs/attachment.cgi?id=13602&action=edit
example code
the following code when built with clang 3.5.0 with -O1 or above is compiled
incorrectly:
#include <stdio.h>
union u {
size_t _refptr;
void setPtr(int* refptr, bool readonly = false) {
_refptr = (size_t)refptr;
if (readonly)
_refptr |= 1;
}
int* getPtr() const {
// the line below is compiled incorrectly with clang++ 3.5.0 -O1 or above
return (int*)((_refptr & 1L) ? (_refptr ^ 1L) : _refptr);
}
};
int main(int argc, char *argv[]) {
u u;
int i = 100;
u.setPtr(&i);
printf("i: %p p(i): %p: %s\n", &i, u.getPtr(), &i == u.getPtr() ? "OK" :
"ERROR");
return 0;
}
-- example output is:
i: 0x7fff6adf3dac p(i): 0x7fff6adf3dad: ERROR
basically the conditional operator is evaluated with the opposite arguments
according to its boolean operand expression in this case.
I tried some other simple cases and it was OK - no clue why this is happening,
but in my case it's a big bug (I store values in the low bits of some pointers
using this trick in some cases to optimize memory usage).
Note that compiling without optimizations results in correct code generation.
Maybe there's something awry with the optimizer with this case.
--
You are receiving this mail because:
You are on the CC list for the bug.
_______________________________________________
LLVMbugs mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/llvmbugs