diff options
author | Dan Gohman <gohman@apple.com> | 2008-08-04 23:30:41 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2008-08-04 23:30:41 +0000 |
commit | 1f565bcff6781d0a4395b4c386f7168df13ddbca (patch) | |
tree | 176fd93cbe4f4b7fccc340a16d46deaf35266cb1 /lib/CodeGen | |
parent | d0859943ac16389fb843f1357746aade3cd07a6f (diff) | |
download | external_llvm-1f565bcff6781d0a4395b4c386f7168df13ddbca.zip external_llvm-1f565bcff6781d0a4395b4c386f7168df13ddbca.tar.gz external_llvm-1f565bcff6781d0a4395b4c386f7168df13ddbca.tar.bz2 |
Fix SDISel lowering of zeroinitializer and undef to use ComputeValueVTs.
This allows it to work correctly on nested aggregate values.
This fixes PR2625.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@54330 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 32 |
1 files changed, 8 insertions, 24 deletions
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index ef90400..1e8afe8 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -1184,34 +1184,18 @@ SDValue SelectionDAGLowering::getValue(const Value *V) { return DAG.getMergeValues(&Constants[0], Constants.size()); } - if (const ArrayType *ATy = dyn_cast<ArrayType>(C->getType())) { + if (isa<StructType>(C->getType()) || isa<ArrayType>(C->getType())) { assert((isa<ConstantAggregateZero>(C) || isa<UndefValue>(C)) && - "Unknown array constant!"); - unsigned NumElts = ATy->getNumElements(); - if (NumElts == 0) - return SDValue(); // empty array - MVT EltVT = TLI.getValueType(ATy->getElementType()); - SmallVector<SDValue, 4> Constants(NumElts); - for (unsigned i = 0, e = NumElts; i != e; ++i) { - if (isa<UndefValue>(C)) - Constants[i] = DAG.getNode(ISD::UNDEF, EltVT); - else if (EltVT.isFloatingPoint()) - Constants[i] = DAG.getConstantFP(0, EltVT); - else - Constants[i] = DAG.getConstant(0, EltVT); - } - return DAG.getMergeValues(&Constants[0], Constants.size()); - } + "Unknown struct or array constant!"); - if (const StructType *STy = dyn_cast<StructType>(C->getType())) { - assert((isa<ConstantAggregateZero>(C) || isa<UndefValue>(C)) && - "Unknown struct constant!"); - unsigned NumElts = STy->getNumElements(); + SmallVector<MVT, 4> ValueVTs; + ComputeValueVTs(TLI, C->getType(), ValueVTs); + unsigned NumElts = ValueVTs.size(); if (NumElts == 0) return SDValue(); // empty struct SmallVector<SDValue, 4> Constants(NumElts); - for (unsigned i = 0, e = NumElts; i != e; ++i) { - MVT EltVT = TLI.getValueType(STy->getElementType(i)); + for (unsigned i = 0; i != NumElts; ++i) { + MVT EltVT = ValueVTs[i]; if (isa<UndefValue>(C)) Constants[i] = DAG.getNode(ISD::UNDEF, EltVT); else if (EltVT.isFloatingPoint()) @@ -1219,7 +1203,7 @@ SDValue SelectionDAGLowering::getValue(const Value *V) { else Constants[i] = DAG.getConstant(0, EltVT); } - return DAG.getMergeValues(&Constants[0], Constants.size()); + return DAG.getMergeValues(&Constants[0], NumElts); } const VectorType *VecTy = cast<VectorType>(V->getType()); |