[LLVMdev] Bug in InsertElement constant propagation?

Raoux, Thomas F thomas.f.raoux at intel.com
Wed Jan 14 08:22:49 PST 2015


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?

Cheers,
Thomas

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150114/18f1ee55/attachment.html>


More information about the llvm-dev mailing list