mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
Fix SDISel lowering of zeroinitializer and undef to use ComputeValueVTs.
This allows it to work correctly on nested aggregate values. This fixes PR2625. llvm-svn: 54330
This commit is contained in:
parent
5d0df78ae0
commit
af429b3e52
@ -1184,34 +1184,18 @@ SDValue SelectionDAGLowering::getValue(const Value *V) {
|
|||||||
return DAG.getMergeValues(&Constants[0], Constants.size());
|
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)) &&
|
assert((isa<ConstantAggregateZero>(C) || isa<UndefValue>(C)) &&
|
||||||
"Unknown array constant!");
|
"Unknown struct or 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());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (const StructType *STy = dyn_cast<StructType>(C->getType())) {
|
SmallVector<MVT, 4> ValueVTs;
|
||||||
assert((isa<ConstantAggregateZero>(C) || isa<UndefValue>(C)) &&
|
ComputeValueVTs(TLI, C->getType(), ValueVTs);
|
||||||
"Unknown struct constant!");
|
unsigned NumElts = ValueVTs.size();
|
||||||
unsigned NumElts = STy->getNumElements();
|
|
||||||
if (NumElts == 0)
|
if (NumElts == 0)
|
||||||
return SDValue(); // empty struct
|
return SDValue(); // empty struct
|
||||||
SmallVector<SDValue, 4> Constants(NumElts);
|
SmallVector<SDValue, 4> Constants(NumElts);
|
||||||
for (unsigned i = 0, e = NumElts; i != e; ++i) {
|
for (unsigned i = 0; i != NumElts; ++i) {
|
||||||
MVT EltVT = TLI.getValueType(STy->getElementType(i));
|
MVT EltVT = ValueVTs[i];
|
||||||
if (isa<UndefValue>(C))
|
if (isa<UndefValue>(C))
|
||||||
Constants[i] = DAG.getNode(ISD::UNDEF, EltVT);
|
Constants[i] = DAG.getNode(ISD::UNDEF, EltVT);
|
||||||
else if (EltVT.isFloatingPoint())
|
else if (EltVT.isFloatingPoint())
|
||||||
@ -1219,7 +1203,7 @@ SDValue SelectionDAGLowering::getValue(const Value *V) {
|
|||||||
else
|
else
|
||||||
Constants[i] = DAG.getConstant(0, EltVT);
|
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());
|
const VectorType *VecTy = cast<VectorType>(V->getType());
|
||||||
|
17
test/CodeGen/Generic/pr2625.ll
Normal file
17
test/CodeGen/Generic/pr2625.ll
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
; RUN: llvm-as < %s | llc
|
||||||
|
; PR2625
|
||||||
|
|
||||||
|
define i32 @main({ i32, { i32 } }*) {
|
||||||
|
entry:
|
||||||
|
%state = alloca { i32, { i32 } }* ; <{ i32, { i32 } }**> [#uses=2]
|
||||||
|
store { i32, { i32 } }* %0, { i32, { i32 } }** %state
|
||||||
|
%retval = alloca i32 ; <i32*> [#uses=2]
|
||||||
|
store i32 0, i32* %retval
|
||||||
|
load { i32, { i32 } }** %state ; <{ i32, { i32 } }*>:1 [#uses=1]
|
||||||
|
store { i32, { i32 } } zeroinitializer, { i32, { i32 } }* %1
|
||||||
|
br label %return
|
||||||
|
|
||||||
|
return: ; preds = %entry
|
||||||
|
load i32* %retval ; <i32>:2 [#uses=1]
|
||||||
|
ret i32 %2
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user