diff --git a/llvm/lib/ExecutionEngine/ExecutionEngine.cpp b/llvm/lib/ExecutionEngine/ExecutionEngine.cpp index 38aed020bb11..eb3833dfdc9f 100644 --- a/llvm/lib/ExecutionEngine/ExecutionEngine.cpp +++ b/llvm/lib/ExecutionEngine/ExecutionEngine.cpp @@ -929,94 +929,32 @@ GenericValue ExecutionEngine::getConstantValue(const Constant *C) { report_fatal_error( "Scalable vector support not yet implemented in ExecutionEngine"); case Type::FixedVectorTyID: { - unsigned elemNum; - Type* ElemTy; - const ConstantDataVector *CDV = dyn_cast(C); - const ConstantVector *CV = dyn_cast(C); - const ConstantAggregateZero *CAZ = dyn_cast(C); + Type *ElemTy = cast(C->getType())->getElementType(); + if (!ElemTy->isIntegerTy() && !ElemTy->isFloatTy() && !ElemTy->isDoubleTy()) + llvm_unreachable("Unknown constant pointer type!"); - if (CDV) { - elemNum = CDV->getNumElements(); - ElemTy = CDV->getElementType(); - } else if (CV || CAZ) { - auto *VTy = cast(C->getType()); - elemNum = VTy->getNumElements(); - ElemTy = VTy->getElementType(); - } else { - llvm_unreachable("Unknown constant vector type!"); + unsigned ElemNum = cast(C->getType())->getNumElements(); + Result.AggregateVal.resize(ElemNum); + for (unsigned I = 0; I < ElemNum; ++I) { + Constant *Elt = C->getAggregateElement(I); + if (!Elt) + llvm_unreachable("Failed to extract element from constant vector!"); + + if (auto *CI = dyn_cast(Elt)) + Result.AggregateVal[I].IntVal = CI->getValue(); + else if (auto *CFP = dyn_cast(Elt)) { + APFloat Val = CFP->getValueAPF(); + if (ElemTy->isFloatTy()) + Result.AggregateVal[I].FloatVal = Val.convertToFloat(); + else + Result.AggregateVal[I].DoubleVal = Val.convertToDouble(); + } else if (isa(Elt)) { + if (ElemTy->isIntegerTy()) + Result.AggregateVal[I].IntVal = + APInt(ElemTy->getScalarSizeInBits(), 0ull); + } else + llvm_unreachable("Unknown constant pointer type!"); } - - Result.AggregateVal.resize(elemNum); - // Check if vector holds floats. - if(ElemTy->isFloatTy()) { - if (CAZ) { - GenericValue floatZero; - floatZero.FloatVal = 0.f; - llvm::fill(Result.AggregateVal, floatZero); - break; - } - if(CV) { - for (unsigned i = 0; i < elemNum; ++i) - if (!isa(CV->getOperand(i))) - Result.AggregateVal[i].FloatVal = cast( - CV->getOperand(i))->getValueAPF().convertToFloat(); - break; - } - if(CDV) - for (unsigned i = 0; i < elemNum; ++i) - Result.AggregateVal[i].FloatVal = CDV->getElementAsFloat(i); - - break; - } - // Check if vector holds doubles. - if (ElemTy->isDoubleTy()) { - if (CAZ) { - GenericValue doubleZero; - doubleZero.DoubleVal = 0.0; - llvm::fill(Result.AggregateVal, doubleZero); - break; - } - if(CV) { - for (unsigned i = 0; i < elemNum; ++i) - if (!isa(CV->getOperand(i))) - Result.AggregateVal[i].DoubleVal = cast( - CV->getOperand(i))->getValueAPF().convertToDouble(); - break; - } - if(CDV) - for (unsigned i = 0; i < elemNum; ++i) - Result.AggregateVal[i].DoubleVal = CDV->getElementAsDouble(i); - - break; - } - // Check if vector holds integers. - if (ElemTy->isIntegerTy()) { - if (CAZ) { - GenericValue intZero; - intZero.IntVal = APInt(ElemTy->getScalarSizeInBits(), 0ull); - llvm::fill(Result.AggregateVal, intZero); - break; - } - if(CV) { - for (unsigned i = 0; i < elemNum; ++i) - if (!isa(CV->getOperand(i))) - Result.AggregateVal[i].IntVal = cast( - CV->getOperand(i))->getValue(); - else { - Result.AggregateVal[i].IntVal = - APInt(CV->getOperand(i)->getType()->getPrimitiveSizeInBits(), 0); - } - break; - } - if(CDV) - for (unsigned i = 0; i < elemNum; ++i) - Result.AggregateVal[i].IntVal = APInt( - CDV->getElementType()->getPrimitiveSizeInBits(), - CDV->getElementAsInteger(i)); - - break; - } - llvm_unreachable("Unknown constant pointer type!"); } break; default: diff --git a/llvm/test/ExecutionEngine/Interpreter/test-interp-vec-insertelement.ll b/llvm/test/ExecutionEngine/Interpreter/test-interp-vec-insertelement.ll index a6698e60fc3a..35e23c61f9ec 100644 --- a/llvm/test/ExecutionEngine/Interpreter/test-interp-vec-insertelement.ll +++ b/llvm/test/ExecutionEngine/Interpreter/test-interp-vec-insertelement.ll @@ -1,4 +1,5 @@ ; RUN: %lli -jit-kind=mcjit -force-interpreter=true %s > /dev/null + ; RUN: %lli -jit-kind=mcjit -force-interpreter=true -use-constant-int-for-fixed-length-splat -use-constant-fp-for-fixed-length-splat %s > /dev/null define i32 @main() { %v0 = insertelement <2 x i8> zeroinitializer, i8 1, i32 1 @@ -37,5 +38,7 @@ define i32 @main() { %v28 = insertelement <8 x double> zeroinitializer, double 4.0, i32 4 %v29 = insertelement <16 x double> zeroinitializer, double 5.0, i32 7 + %v30 = insertelement <16 x i64> splat(i64 1), i64 5, i32 7 + %v31 = insertelement <16 x double> splat(double 1.0), double 5.0, i32 7 ret i32 0 }