Zheng, Bixia
2009-Dec-07 23:51 UTC
[LLVMdev] a constant folding case causing different results w/ot optimization
Hi,
The optimizer folds "(unsigned int) -1.0f" to 0. As a result, the
following routine foo returns 0 with optimization, and returns -1
(0xffffffff) without optimization.
unsigned int foo()
{
float myfloat = -1.0f;
unsigned int myint = (unsigned int) myfloat;
return myint;
}
INSTCOMBINE ITERATION #0 on
IC: ConstFold to: i32 0 from: %conv = fptoui float -1.000000e+000 to
i32 ; <i32> [#uses=1]
While the result of "(unsigned int) -1.0f" is probably implementation
defined, both gcc and Microsoft cl produce -1.
Will you consider this an optimizer bug and fix it?
Thanks,
bixia
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20091207/b04a7a8f/attachment.html>
Eli Friedman
2009-Dec-08 00:50 UTC
[LLVMdev] a constant folding case causing different results w/ot optimization
On Mon, Dec 7, 2009 at 3:51 PM, Zheng, Bixia <Bixia.Zheng at amd.com> wrote:> While the result of “(unsigned int) -1.0f” is probably implementation > defined, both gcc and Microsoft cl produce -1.LLVM (and C/C++) consider the result to be undefined (i.e. it can produce anything). And it can actually produce results other than -1 on some platforms supported by LLVM. So I don't see any good reason to choose your way of folding it over the current method. -Eli
Chris Lattner
2009-Dec-08 04:58 UTC
[LLVMdev] a constant folding case causing different results w/ot optimization
On Dec 7, 2009, at 4:50 PM, Eli Friedman wrote:> On Mon, Dec 7, 2009 at 3:51 PM, Zheng, Bixia <Bixia.Zheng at amd.com> wrote: >> While the result of “(unsigned int) -1.0f” is probably implementation >> defined, both gcc and Microsoft cl produce -1. > > LLVM (and C/C++) consider the result to be undefined (i.e. it can > produce anything). And it can actually produce results other than -1 > on some platforms supported by LLVM. So I don't see any good reason > to choose your way of folding it over the current method.Yes. If you're interested in improving this, folding it to undef would be better than to 0. -Chris
Apparently Analagous Threads
- [LLVMdev] a constant folding case causing different results w/ot optimization
- [LLVMdev] Declaring constant global variables
- [PATCH v3 0/4] Constant folding of new Instructions
- [Constant Folder, InstCombine, ARM, AArch64] Question about constant folding of vector load
- [LLVMdev] question on constant folding