fix a crash on a pointless but valid zero-length memset, rdar://6808691

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@69680 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2009-04-21 16:52:12 +00:00
parent 83985d706b
commit 33e24adc3b
2 changed files with 31 additions and 13 deletions

View File

@ -1431,6 +1431,7 @@ void SROA::ConvertUsesToScalar(Value *Ptr, AllocaInst *NewAI, uint64_t Offset) {
if (MemSetInst *MSI = dyn_cast<MemSetInst>(User)) {
assert(MSI->getRawDest() == Ptr && "Consistency error!");
unsigned NumBytes = cast<ConstantInt>(MSI->getLength())->getZExtValue();
if (NumBytes != 0) {
unsigned Val = cast<ConstantInt>(MSI->getValue())->getZExtValue();
// Compute the value replicated the right number of times.
@ -1445,6 +1446,7 @@ void SROA::ConvertUsesToScalar(Value *Ptr, AllocaInst *NewAI, uint64_t Offset) {
Value *New = ConvertScalar_InsertValue(ConstantInt::get(APVal), Old,
Offset, Builder);
Builder.CreateStore(New, NewAI);
}
MSI->eraseFromParent();
continue;
}

View File

@ -0,0 +1,16 @@
; RUN: llvm-as < %s | opt -scalarrepl | llvm-dis
; rdar://6808691
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
target triple = "x86_64-apple-darwin9.0"
type <{ i32, i16, i8, i8, i64, i64, i16, [0 x i16] }>
define i32 @foo() {
entry:
%.compoundliteral = alloca %0
%tmp228 = getelementptr %0* %.compoundliteral, i32 0, i32 7
%tmp229 = bitcast [0 x i16]* %tmp228 to i8*
call void @llvm.memset.i64(i8* %tmp229, i8 0, i64 0, i32 2)
unreachable
}
declare void @llvm.memset.i64(i8* nocapture, i8, i64, i32) nounwind