From 2eb8653157ccd318b357af74bfd517c76ef166b8 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 24 Mar 2006 07:29:17 +0000 Subject: [PATCH] prefer to generate constant pool loads over splats. This prevents us from using a splat for {1.0,1.0,1.0,1.0} git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@27055 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 71 ++++++++++++------------ 1 file changed, 35 insertions(+), 36 deletions(-) diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index b8a20fc3089..dfafb70585f 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -3113,6 +3113,11 @@ SDOperand SelectionDAGLegalize::ExpandBUILD_VECTOR(SDNode *Node) { SDOperand SplatValue = Node->getOperand(0); std::map > Values; Values[SplatValue].push_back(0); + bool isConstant = true; + if (!isa(SplatValue) && !isa(SplatValue) && + SplatValue.getOpcode() != ISD::UNDEF) + isConstant = false; + for (unsigned i = 1; i < NumElems; ++i) { SDOperand V = Node->getOperand(i); std::map >::iterator I = Values.find(V); @@ -3124,6 +3129,12 @@ SDOperand SelectionDAGLegalize::ExpandBUILD_VECTOR(SDNode *Node) { isOnlyLowElement = false; if (SplatValue != V) SplatValue = SDOperand(0,0); + + // If this isn't a constant element or an undef, we can't use a constant + // pool load. + if (!isa(V) && !isa(V) && + V.getOpcode() != ISD::UNDEF) + isConstant = false; } if (isOnlyLowElement) { @@ -3135,6 +3146,30 @@ SDOperand SelectionDAGLegalize::ExpandBUILD_VECTOR(SDNode *Node) { Node->getOperand(0)); } + // If all elements are constants, create a load from the constant pool. + if (isConstant) { + MVT::ValueType VT = Node->getValueType(0); + const Type *OpNTy = + MVT::getTypeForValueType(Node->getOperand(0).getValueType()); + std::vector CV; + for (unsigned i = 0, e = NumElems; i != e; ++i) { + if (ConstantFPSDNode *V = + dyn_cast(Node->getOperand(i))) { + CV.push_back(ConstantFP::get(OpNTy, V->getValue())); + } else if (ConstantSDNode *V = + dyn_cast(Node->getOperand(i))) { + CV.push_back(ConstantUInt::get(OpNTy, V->getValue())); + } else { + assert(Node->getOperand(i).getOpcode() == ISD::UNDEF); + CV.push_back(UndefValue::get(OpNTy)); + } + } + Constant *CP = ConstantPacked::get(CV); + SDOperand CPIdx = DAG.getConstantPool(CP, TLI.getPointerTy()); + return DAG.getLoad(VT, DAG.getEntryNode(), CPIdx, + DAG.getSrcValue(NULL)); + } + if (SplatValue.Val) { // Splat of one value? // Build the shuffle constant vector: <0, 0, 0, 0> MVT::ValueType MaskVT = @@ -3156,42 +3191,6 @@ SDOperand SelectionDAGLegalize::ExpandBUILD_VECTOR(SDNode *Node) { } } - // If the elements are all constants, turn this into a load from the constant - // pool. - bool isConstant = true; - for (SDNode::op_iterator I = Node->op_begin(), E = Node->op_end(); - I != E; ++I) { - if (!isa(I) && !isa(I) && - I->getOpcode() != ISD::UNDEF) { - isConstant = false; - break; - } - } - - // Create a ConstantPacked, and put it in the constant pool. - if (isConstant) { - MVT::ValueType VT = Node->getValueType(0); - const Type *OpNTy = - MVT::getTypeForValueType(Node->getOperand(0).getValueType()); - std::vector CV; - for (unsigned i = 0, e = NumElems; i != e; ++i) { - if (ConstantFPSDNode *V = - dyn_cast(Node->getOperand(i))) { - CV.push_back(ConstantFP::get(OpNTy, V->getValue())); - } else if (ConstantSDNode *V = - dyn_cast(Node->getOperand(i))) { - CV.push_back(ConstantUInt::get(OpNTy, V->getValue())); - } else { - assert(Node->getOperand(i).getOpcode() == ISD::UNDEF); - CV.push_back(UndefValue::get(OpNTy)); - } - } - Constant *CP = ConstantPacked::get(CV); - SDOperand CPIdx = DAG.getConstantPool(CP, TLI.getPointerTy()); - return DAG.getLoad(VT, DAG.getEntryNode(), CPIdx, - DAG.getSrcValue(NULL)); - } - // If there are only two unique elements, we may be able to turn this into a // vector shuffle. if (Values.size() == 2) {