When bitcast from <4 x float> to i128, we should not use extractelement directly. Instead, we cast <4 x float> to <4 x i32>, then use extractelement to get individual element.
Signed-off-by: Ruiling Song <[email protected]> --- backend/src/llvm/llvm_legalize.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/backend/src/llvm/llvm_legalize.cpp b/backend/src/llvm/llvm_legalize.cpp index ea0e75a..bb09eab 100644 --- a/backend/src/llvm/llvm_legalize.cpp +++ b/backend/src/llvm/llvm_legalize.cpp @@ -516,8 +516,15 @@ namespace gbe { Type *splitTy = vecTy->getElementType(); unsigned elements = srcTy->getPrimitiveSizeInBits()/splitTy->getPrimitiveSizeInBits(); // bitcast large integer from vector, so we do extractElement to get split integer + unsigned splitSz = splitTy->getPrimitiveSizeInBits(); + Value *src = p->getOperand(0); + // if it is cast from <4 x float> to i128 + // we cast <4 x float> to <4 x i32> first + if (!splitTy->isIntegerTy()) + src = Builder.CreateBitCast(src, VectorType::get(IntegerType::get(p->getContext(), splitSz), elements)); + for (unsigned i = 0; i < elements; i++) { - Value *NV = Builder.CreateExtractElement(p->getOperand(0), + Value *NV = Builder.CreateExtractElement(src, ConstantInt::get(IntegerType::get(p->getContext(), 32), i)); split.push_back(NV); } -- 1.7.10.4 _______________________________________________ Beignet mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/beignet
