diff options
| author | Evan Cheng <evan.cheng@apple.com> | 2006-04-05 06:07:11 +0000 | 
|---|---|---|
| committer | Evan Cheng <evan.cheng@apple.com> | 2006-04-05 06:07:11 +0000 | 
| commit | 9fa8959dce47f947276eae161e2d238ffac6e6db (patch) | |
| tree | b6ba012485faf9570db50217190274e12a487f8e /llvm/lib | |
| parent | 8f21ca7effd419f293f36defb7b0f77ea5f3f3ff (diff) | |
| download | bcm5719-llvm-9fa8959dce47f947276eae161e2d238ffac6e6db.tar.gz bcm5719-llvm-9fa8959dce47f947276eae161e2d238ffac6e6db.zip | |
Exapnd a VECTOR_SHUFFLE to a BUILD_VECTOR if target asks for it to be expanded
or custom lowering fails.
llvm-svn: 27432
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 32 | 
1 files changed, 30 insertions, 2 deletions
| diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 1d624dbc147..b0d0b37aa64 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -933,9 +933,37 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {               "vector shuffle should not be created if not legal!");        break;      case TargetLowering::Custom: -      Tmp1 = TLI.LowerOperation(Result, DAG); -      if (Tmp1.Val) Result = Tmp1; +      Tmp3 = TLI.LowerOperation(Result, DAG); +      if (Tmp3.Val) { +        Result = Tmp3; +        break; +      } +      // FALLTHROUGH +    case TargetLowering::Expand: { +      MVT::ValueType VT = Node->getValueType(0); +      MVT::ValueType EltVT = MVT::getVectorBaseType(VT); +      MVT::ValueType PtrVT = TLI.getPointerTy(); +      SDOperand Mask = Node->getOperand(2); +      unsigned NumElems = Mask.getNumOperands(); +      std::vector<SDOperand> Ops; +      for (unsigned i = 0; i != NumElems; ++i) { +        SDOperand Arg = Mask.getOperand(i); +        if (Arg.getOpcode() == ISD::UNDEF) { +          Ops.push_back(DAG.getNode(ISD::UNDEF, EltVT)); +        } else { +          assert(isa<ConstantSDNode>(Arg) && "Invalid VECTOR_SHUFFLE mask!"); +          unsigned Idx = cast<ConstantSDNode>(Arg)->getValue(); +          if (Idx < NumElems) +            Ops.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, EltVT, Tmp1, +                                      DAG.getConstant(Idx, PtrVT))); +          else +            Ops.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, EltVT, Tmp2, +                                      DAG.getConstant(Idx - NumElems, PtrVT))); +        } +      } +      Result = DAG.getNode(ISD::BUILD_VECTOR, VT, Ops);        break; +    }      case TargetLowering::Promote: {        // Change base type to a different vector type.        MVT::ValueType OVT = Node->getValueType(0); | 

