aboutsummaryrefslogtreecommitdiffstats
path: root/lib/CodeGen
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2008-08-04 23:30:41 +0000
committerDan Gohman <gohman@apple.com>2008-08-04 23:30:41 +0000
commit1f565bcff6781d0a4395b4c386f7168df13ddbca (patch)
tree176fd93cbe4f4b7fccc340a16d46deaf35266cb1 /lib/CodeGen
parentd0859943ac16389fb843f1357746aade3cd07a6f (diff)
downloadexternal_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.cpp32
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());