summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCameron Zwarich <zwarich@apple.com>2011-10-23 07:02:10 +0000
committerCameron Zwarich <zwarich@apple.com>2011-10-23 07:02:10 +0000
commit057fbb1a10674e64d44d72ed3cdac64407d7e726 (patch)
treea5d62bb6d02b9f4caada270eb83ae7c94461fa2a
parent142adc492be981bf2ca9527b71f3d623fe141f4f (diff)
downloadbcm5719-llvm-057fbb1a10674e64d44d72ed3cdac64407d7e726.tar.gz
bcm5719-llvm-057fbb1a10674e64d44d72ed3cdac64407d7e726.zip
The element insertion code in scalar replacement doesn't handle incorrect
element types, even though the element extraction code does. It is surprising that this bug has been here for so long. Fixes <rdar://problem/10318778>. llvm-svn: 142740
-rw-r--r--llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp6
-rw-r--r--llvm/test/Transforms/ScalarRepl/2011-10-22-VectorCrash.ll19
2 files changed, 23 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp b/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp
index c6d9123d661..b89f7306a28 100644
--- a/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp
+++ b/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp
@@ -806,8 +806,10 @@ ConvertScalar_InsertValue(Value *SV, Value *Old,
return Builder.CreateBitCast(SV, AllocaType);
// Must be an element insertion.
- assert(SV->getType() == VTy->getElementType());
- uint64_t EltSize = TD.getTypeAllocSizeInBits(VTy->getElementType());
+ Type *EltTy = VTy->getElementType();
+ if (SV->getType() != EltTy)
+ SV = Builder.CreateBitCast(SV, EltTy);
+ uint64_t EltSize = TD.getTypeAllocSizeInBits(EltTy);
unsigned Elt = Offset/EltSize;
return Builder.CreateInsertElement(Old, SV, Builder.getInt32(Elt));
}
diff --git a/llvm/test/Transforms/ScalarRepl/2011-10-22-VectorCrash.ll b/llvm/test/Transforms/ScalarRepl/2011-10-22-VectorCrash.ll
new file mode 100644
index 00000000000..cd21ff5f0b5
--- /dev/null
+++ b/llvm/test/Transforms/ScalarRepl/2011-10-22-VectorCrash.ll
@@ -0,0 +1,19 @@
+; RUN: opt < %s -S -scalarrepl | FileCheck %s
+target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32"
+target triple = "thumbv7-apple-ios5.0.0"
+
+%union.anon = type { <4 x float> }
+
+; CHECK: @test
+; CHECK-NOT: alloca
+
+define void @test() nounwind {
+entry:
+ %u = alloca %union.anon, align 16
+ %u164 = bitcast %union.anon* %u to [4 x i32]*
+ %arrayidx165 = getelementptr inbounds [4 x i32]* %u164, i32 0, i32 0
+ store i32 undef, i32* %arrayidx165, align 4
+ %v186 = bitcast %union.anon* %u to <4 x float>*
+ store <4 x float> undef, <4 x float>* %v186, align 16
+ ret void
+}
OpenPOWER on IntegriCloud