[LLVM][ExecutionEngine] Add vector ConstantInt/FP support to getConstantValue(). (#182538)
Unify vector constant handling via calls to getAggregateElement rather than handling each constant type separately.
This commit is contained in:
parent
d8671280d4
commit
fc69531254
@ -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<ConstantDataVector>(C);
|
||||
const ConstantVector *CV = dyn_cast<ConstantVector>(C);
|
||||
const ConstantAggregateZero *CAZ = dyn_cast<ConstantAggregateZero>(C);
|
||||
Type *ElemTy = cast<FixedVectorType>(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<FixedVectorType>(C->getType());
|
||||
elemNum = VTy->getNumElements();
|
||||
ElemTy = VTy->getElementType();
|
||||
} else {
|
||||
llvm_unreachable("Unknown constant vector type!");
|
||||
unsigned ElemNum = cast<FixedVectorType>(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<ConstantInt>(Elt))
|
||||
Result.AggregateVal[I].IntVal = CI->getValue();
|
||||
else if (auto *CFP = dyn_cast<ConstantFP>(Elt)) {
|
||||
APFloat Val = CFP->getValueAPF();
|
||||
if (ElemTy->isFloatTy())
|
||||
Result.AggregateVal[I].FloatVal = Val.convertToFloat();
|
||||
else
|
||||
Result.AggregateVal[I].DoubleVal = Val.convertToDouble();
|
||||
} else if (isa<UndefValue>(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<UndefValue>(CV->getOperand(i)))
|
||||
Result.AggregateVal[i].FloatVal = cast<ConstantFP>(
|
||||
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<UndefValue>(CV->getOperand(i)))
|
||||
Result.AggregateVal[i].DoubleVal = cast<ConstantFP>(
|
||||
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<UndefValue>(CV->getOperand(i)))
|
||||
Result.AggregateVal[i].IntVal = cast<ConstantInt>(
|
||||
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:
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user