[LLVMdev] Bug in InsertElement constant propagation?

Jonathan Roelofs jonathan at codesourcery.com
Wed Jan 14 09:38:50 PST 2015



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