From 10a7aa6dea8d862feda05098d82a7630c80c30d8 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Fri, 29 Jun 2007 00:09:08 +0000 Subject: [PATCH] Fix an assertion failure in legalizing bitcast operators on targets where vectors are split down to single elements as part of legalization. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37785 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 38 +++++++++------------- test/CodeGen/ARM/illegal-vector-bitcast.ll | 13 ++++++++ 2 files changed, 28 insertions(+), 23 deletions(-) create mode 100644 test/CodeGen/ARM/illegal-vector-bitcast.ll diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index a239aef16c0..ab7e00f80a3 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -5568,38 +5568,30 @@ void SelectionDAGLegalize::SplitVectorOp(SDOperand Op, SDOperand &Lo, case ISD::BIT_CONVERT: { // We know the result is a vector. The input may be either a vector or a // scalar value. - if (!MVT::isVector(Op.getOperand(0).getValueType())) { - // Lower to a store/load. FIXME: this could be improved probably. - SDOperand Ptr = CreateStackTemporary(Op.getOperand(0).getValueType()); + SDOperand InOp = Node->getOperand(0); + if (!MVT::isVector(InOp.getValueType()) || + MVT::getVectorNumElements(InOp.getValueType()) == 1) { + // The input is a scalar or single-element vector. + // Lower to a store/load so that it can be split. + // FIXME: this could be improved probably. + SDOperand Ptr = CreateStackTemporary(InOp.getValueType()); SDOperand St = DAG.getStore(DAG.getEntryNode(), - Op.getOperand(0), Ptr, NULL, 0); - St = DAG.getLoad(NewVT, St, Ptr, NULL, 0); - SplitVectorOp(St, Lo, Hi); - } else { - // If the input is a vector type, we have to either scalarize it, pack it - // or convert it based on whether the input vector type is legal. - SDNode *InVal = Node->getOperand(0).Val; - unsigned NumElems = MVT::getVectorNumElements(InVal->getValueType(0)); - - assert(NumElems > 1); - { - // Split the input vector. - SplitVectorOp(Op.getOperand(0), Lo, Hi); - - // Convert each of the pieces now. - Lo = DAG.getNode(ISD::BIT_CONVERT, NewVT, Lo); - Hi = DAG.getNode(ISD::BIT_CONVERT, NewVT, Hi); - } - break; + InOp, Ptr, NULL, 0); + InOp = DAG.getLoad(Op.getValueType(), St, Ptr, NULL, 0); } + // Split the vector and convert each of the pieces now. + SplitVectorOp(InOp, Lo, Hi); + Lo = DAG.getNode(ISD::BIT_CONVERT, NewVT, Lo); + Hi = DAG.getNode(ISD::BIT_CONVERT, NewVT, Hi); + break; } } // Remember in a map if the values will be reused later. bool isNew = SplitNodes.insert(std::make_pair(Op, std::make_pair(Lo, Hi))).second; - assert(isNew && "Value already expanded?!?"); + assert(isNew && "Value already split?!?"); } diff --git a/test/CodeGen/ARM/illegal-vector-bitcast.ll b/test/CodeGen/ARM/illegal-vector-bitcast.ll new file mode 100644 index 00000000000..6785cfd6f8e --- /dev/null +++ b/test/CodeGen/ARM/illegal-vector-bitcast.ll @@ -0,0 +1,13 @@ +; RUN: llvm-as < %s | llc -march=arm + +define void @foo(<8 x float>* %f, <8 x float>* %g, <4 x i64>* %y) +{ + %h = load <8 x float>* %f + %i = mul <8 x float> %h, + %m = bitcast <8 x float> %i to <4 x i64> + %z = load <4 x i64>* %y + %n = mul <4 x i64> %z, %m + %p = bitcast <4 x i64> %n to <8 x float> + store <8 x float> %p, <8 x float>* %g + ret void +} -- 2.34.1