SimplifyLibCalls: Fix crash on memset(notmalloc())

rdar://31520787

llvm-svn: 301352
This commit is contained in:
Matthias Braun 2017-04-25 19:44:25 +00:00
parent dd21502482
commit c36a78c3f3
2 changed files with 12 additions and 0 deletions

View File

@ -842,6 +842,9 @@ static Value *foldMallocMemset(CallInst *Memset, IRBuilder<> &B,
// Is the inner call really malloc()?
Function *InnerCallee = Malloc->getCalledFunction();
if (!InnerCallee)
return nullptr;
LibFunc Func;
if (!TLI.getLibFunc(*InnerCallee, Func) || !TLI.has(Func) ||
Func != LibFunc_malloc)

View File

@ -26,6 +26,15 @@ define i8* @pr25892_lite(i32 %size) #0 {
; CHECK-NEXT: ret i8* %calloc
}
; This should not create a calloc and not crash the compiler.
; CHECK-LABEL: @notmalloc_memset
; CHECK-NOT: @calloc
define i8* @notmalloc_memset(i32 %size, i8*(i32)* %notmalloc) {
%call1 = call i8* %notmalloc(i32 %size) #1
%call2 = call i8* @memset(i8* %call1, i32 0, i32 %size) #1
ret i8* %call2
}
; FIXME: memset(malloc(x), 0, x) -> calloc(1, x)
; This doesn't fire currently because the malloc has more than one use.