mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-21 21:29:41 +00:00
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:
parent
83985d706b
commit
33e24adc3b
@ -1431,20 +1431,22 @@ 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();
|
||||
unsigned Val = cast<ConstantInt>(MSI->getValue())->getZExtValue();
|
||||
|
||||
// Compute the value replicated the right number of times.
|
||||
APInt APVal(NumBytes*8, Val);
|
||||
if (NumBytes != 0) {
|
||||
unsigned Val = cast<ConstantInt>(MSI->getValue())->getZExtValue();
|
||||
|
||||
// Compute the value replicated the right number of times.
|
||||
APInt APVal(NumBytes*8, Val);
|
||||
|
||||
// Splat the value if non-zero.
|
||||
if (Val)
|
||||
for (unsigned i = 1; i != NumBytes; ++i)
|
||||
APVal |= APVal << 8;
|
||||
|
||||
Value *Old = Builder.CreateLoad(NewAI, (NewAI->getName()+".in").c_str());
|
||||
Value *New = ConvertScalar_InsertValue(ConstantInt::get(APVal), Old,
|
||||
Offset, Builder);
|
||||
Builder.CreateStore(New, NewAI);
|
||||
// Splat the value if non-zero.
|
||||
if (Val)
|
||||
for (unsigned i = 1; i != NumBytes; ++i)
|
||||
APVal |= APVal << 8;
|
||||
|
||||
Value *Old = Builder.CreateLoad(NewAI, (NewAI->getName()+".in").c_str());
|
||||
Value *New = ConvertScalar_InsertValue(ConstantInt::get(APVal), Old,
|
||||
Offset, Builder);
|
||||
Builder.CreateStore(New, NewAI);
|
||||
}
|
||||
MSI->eraseFromParent();
|
||||
continue;
|
||||
}
|
||||
|
16
test/Transforms/ScalarRepl/2009-04-21-ZeroLengthMemSet.ll
Normal file
16
test/Transforms/ScalarRepl/2009-04-21-ZeroLengthMemSet.ll
Normal 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
|
Loading…
x
Reference in New Issue
Block a user