Summary: | Invalid optimization (-O2) when doing double -> int conversion (on big endian archs(?)) | ||
---|---|---|---|
Product: | gcc | Reporter: | Ondřej Surý <ondrej> |
Component: | c | Assignee: | Not yet assigned to anyone <unassigned> |
Status: | RESOLVED DUPLICATE | ||
Severity: | normal | CC: | jakub, mikpelinux |
Priority: | P3 | ||
Version: | 4.7.2 | ||
Target Milestone: | --- | ||
Host: | Target: | ||
Build: | Known to work: | ||
Known to fail: | Last reconfirmed: | ||
Attachments: |
Generated from gd.c, affected code is in clip_1d function
test case |
Description
Ondřej Surý
2013-04-26 10:26:34 UTC
Created attachment 29945 [details]
Generated from gd.c, affected code is in clip_1d function
Maybe I should have said "inconsistent" and this might be related to: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27394 Created attachment 29946 [details] test case I can reproduce the issue on m68k: with the attached test case I get 4 on m68k-linux (big-endian), but 5 on x86_64-linux (little-endian). I don't see any conversions to char or unsigned, so I don't think PR27394 is related. The issue goes away with -ffloat-store on m68k. I haven't analyzed it further. On the big-endian armv5teb-linux-gnueabi I get 5, but it's soft-fp. Yeah, I just came to same conclusion by reading further (PR9325), that it's not related to PR27394, because we are not hitting the boundaries of the conversion type. I understand that the resulting value depends on the time the conversion happen (e.g. when the fractional part gets discarded), but still I think there's something wrong when the result depends on the architecture and the optimization level. I swear I have read the (non) bugs section before reporting the bug. Anyway it's do damn confusing that the result can be different on different architectures :(. *** This bug has been marked as a duplicate of bug 323 *** (In reply to comment #5) > I swear I have read the (non) bugs section before reporting the bug. Anyway > it's do damn confusing that the result can be different on different > architectures :(. Rather on older architectures where the fpu was implemented as a stack one (both 68k and x86 are examples of this). I'd say *y1 -= (int)(m * (*x1 - mindim)); isn't a workaround, but a reasonable thing to do (and less expensive than converting *y1 from int to floating point, doing subtraction in FPU and converting back. |