[LLVMdev] Bug in InsertElement constant propagation?
Raoux, Thomas F
thomas.f.raoux at intel.com
Wed Jan 14 10:12:09 PST 2015
Ha here is what I was missing. Thanks Jon. It still seems to me that the transformation of LLVM IR is invalid is that right? I assume we shouldn't be converting APFloat to float in order to avoid such problems?
-----Original Message-----
From: Jonathan Roelofs [mailto:jonathan at codesourcery.com]
Sent: Wednesday, January 14, 2015 9:39 AM
To: Raoux, Thomas F; LLVM Developers Mailing List
Subject: Re: [LLVMdev] Bug in InsertElement constant propagation?
On 1/14/15 9:22 AM, Raoux, Thomas F wrote:
> Hi,
>
> When I run opt on the following LLVM IR:
>
> define i32 @foo() {
>
> bb0:
>
> %0 = bitcast i32 2139171423 to float
>
> %1 = insertelement <1 x float> undef, float %0, i32 0
>
> %2 = extractelement <1 x float> %1, i32 0
>
> %3 = bitcast float %2 to i32
>
> ret i32 %3
>
> }
>
> ->
>
> It generates:
>
> define i32 @foo() {
>
> bb0:
>
> ret i32 2143365727
>
> }
>
> While tracking the value I see that the floating point value is
> changed while folding insertElement into a constant expression.
>
> In Constant.cpp line 902, we convert the APFloat into float then
> convert it back when creating the ConstantDataArray. This causes the
> float value to be changed. I'm not entirely positive why the float
> value returned by converToFloat has a different memory representation
> than the original int value, there must be a C++ rule that I'm missing.
>
> d
>
> if (ConstantFP *CFP = dyn_cast<ConstantFP>(C)) {
>
> if (CFP->getType()->isFloatTy()) {
>
> SmallVector<float, 16> Elts;
>
> for (unsigned i = 0, e = V.size(); i != e; ++i)
>
> if (ConstantFP *CFP = dyn_cast<ConstantFP>(V[i]))
>
> Elts.push_back(CFP->getValueAPF().convertToFloat());
>
> else
>
> break;
>
> if (Elts.size() == V.size())
>
> return ConstantDataArray::get(C->getContext(), Elts);
>
> }
>
> Anyone knows what is the problem here?
Both bit patterns are representations of NaN, which IIRC, is not required to be preserved when copying a float.
Jon
>
> Cheers,
>
> Thomas
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
--
Jon Roelofs
jonathan at codesourcery.com
CodeSourcery / Mentor Embedded
More information about the llvm-dev
mailing list