summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTanya Lattner <tonic@nondot.org>2009-09-16 01:13:59 +0000
committerTanya Lattner <tonic@nondot.org>2009-09-16 01:13:59 +0000
commitb580bd1eb2cedb51fdc2944ff7a42d9ac6898f4f (patch)
tree4adb7e99537904a745e6947bd16525836b8b426d
parent565fb5a655d27ae3cb6d9297b33976c9eca7fa3e (diff)
downloadllvm-b580bd1eb2cedb51fdc2944ff7a42d9ac6898f4f.tar.gz
Merge 81845 from mainline.
fix PR4963: folding insertvalue would sometimes turn a packed struct into an unpacked one. git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_26@81980 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/VMCore/ConstantFold.cpp44
-rw-r--r--test/Assembler/insertextractvalue.ll6
2 files changed, 30 insertions, 20 deletions
diff --git a/lib/VMCore/ConstantFold.cpp b/lib/VMCore/ConstantFold.cpp
index eda336a5801e..ac817d9a5962 100644
--- a/lib/VMCore/ConstantFold.cpp
+++ b/lib/VMCore/ConstantFold.cpp
@@ -499,17 +499,19 @@ Constant *llvm::ConstantFoldInsertValueInstruction(LLVMContext &Context,
if (isa<UndefValue>(Agg)) {
// Insertion of constant into aggregate undef
- // Optimize away insertion of undef
+ // Optimize away insertion of undef.
if (isa<UndefValue>(Val))
return const_cast<Constant*>(Agg);
+
// Otherwise break the aggregate undef into multiple undefs and do
- // the insertion
+ // the insertion.
const CompositeType *AggTy = cast<CompositeType>(Agg->getType());
unsigned numOps;
if (const ArrayType *AR = dyn_cast<ArrayType>(AggTy))
numOps = AR->getNumElements();
else
numOps = cast<StructType>(AggTy)->getNumElements();
+
std::vector<Constant*> Ops(numOps);
for (unsigned i = 0; i < numOps; ++i) {
const Type *MemberTy = AggTy->getTypeAtIndex(i);
@@ -520,24 +522,27 @@ Constant *llvm::ConstantFoldInsertValueInstruction(LLVMContext &Context,
UndefValue::get(MemberTy);
Ops[i] = const_cast<Constant*>(Op);
}
- if (isa<StructType>(AggTy))
- return ConstantStruct::get(Context, Ops);
- else
- return ConstantArray::get(cast<ArrayType>(AggTy), Ops);
+
+ if (const StructType* ST = dyn_cast<StructType>(AggTy))
+ return ConstantStruct::get(Context, Ops, ST->isPacked());
+ return ConstantArray::get(cast<ArrayType>(AggTy), Ops);
}
+
if (isa<ConstantAggregateZero>(Agg)) {
// Insertion of constant into aggregate zero
- // Optimize away insertion of zero
+ // Optimize away insertion of zero.
if (Val->isNullValue())
return const_cast<Constant*>(Agg);
+
// Otherwise break the aggregate zero into multiple zeros and do
- // the insertion
+ // the insertion.
const CompositeType *AggTy = cast<CompositeType>(Agg->getType());
unsigned numOps;
if (const ArrayType *AR = dyn_cast<ArrayType>(AggTy))
numOps = AR->getNumElements();
else
numOps = cast<StructType>(AggTy)->getNumElements();
+
std::vector<Constant*> Ops(numOps);
for (unsigned i = 0; i < numOps; ++i) {
const Type *MemberTy = AggTy->getTypeAtIndex(i);
@@ -549,13 +554,14 @@ Constant *llvm::ConstantFoldInsertValueInstruction(LLVMContext &Context,
Constant::getNullValue(MemberTy);
Ops[i] = const_cast<Constant*>(Op);
}
- if (isa<StructType>(AggTy))
- return ConstantStruct::get(Context, Ops);
- else
- return ConstantArray::get(cast<ArrayType>(AggTy), Ops);
+
+ if (const StructType* ST = dyn_cast<StructType>(AggTy))
+ return ConstantStruct::get(Context, Ops, ST->isPacked());
+ return ConstantArray::get(cast<ArrayType>(AggTy), Ops);
}
+
if (isa<ConstantStruct>(Agg) || isa<ConstantArray>(Agg)) {
- // Insertion of constant into aggregate constant
+ // Insertion of constant into aggregate constant.
std::vector<Constant*> Ops(Agg->getNumOperands());
for (unsigned i = 0; i < Agg->getNumOperands(); ++i) {
const Constant *Op =
@@ -565,12 +571,10 @@ Constant *llvm::ConstantFoldInsertValueInstruction(LLVMContext &Context,
Agg->getOperand(i);
Ops[i] = const_cast<Constant*>(Op);
}
- Constant *C;
- if (isa<StructType>(Agg->getType()))
- C = ConstantStruct::get(Context, Ops);
- else
- C = ConstantArray::get(cast<ArrayType>(Agg->getType()), Ops);
- return C;
+
+ if (const StructType* ST = dyn_cast<StructType>(Agg->getType()))
+ return ConstantStruct::get(Context, Ops, ST->isPacked());
+ return ConstantArray::get(cast<ArrayType>(Agg->getType()), Ops);
}
return 0;
@@ -585,7 +589,7 @@ Constant *llvm::ConstantFoldBinaryInstruction(LLVMContext &Context,
if (C1->getType() == Type::getPPC_FP128Ty(Context))
return 0;
- // Handle UndefValue up front
+ // Handle UndefValue up front.
if (isa<UndefValue>(C1) || isa<UndefValue>(C2)) {
switch (Opcode) {
case Instruction::Xor:
diff --git a/test/Assembler/insertextractvalue.ll b/test/Assembler/insertextractvalue.ll
index 3581238aa4c1..2f5521fba872 100644
--- a/test/Assembler/insertextractvalue.ll
+++ b/test/Assembler/insertextractvalue.ll
@@ -21,3 +21,9 @@ define float @dar({{i32},{float, double}}* %p) nounwind {
store {{i32},{float, double}} insertvalue ({{i32},{float, double}} zeroinitializer, double 20.0, 1, 1), {{i32},{float, double}}* %p
ret float extractvalue ({{i32},{float, double}} zeroinitializer, 1, 0)
}
+
+
+; PR4963
+define <{ i32, i32 }> @test57() {
+ ret <{ i32, i32 }> insertvalue (<{ i32, i32 }> zeroinitializer, i32 4, 1)
+}