From 953d6af0d12faf5b41ce4dc4b37ece615741e95d Mon Sep 17 00:00:00 2001 From: Matthias Braun Date: Tue, 25 Apr 2017 19:44:25 +0000 Subject: [PATCH] SimplifyLibCalls: Fix crash on memset(notmalloc()) rdar://31520787 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@301352 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Utils/SimplifyLibCalls.cpp | 3 +++ test/Transforms/InstCombine/memset-1.ll | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/lib/Transforms/Utils/SimplifyLibCalls.cpp b/lib/Transforms/Utils/SimplifyLibCalls.cpp index 4818939824e..2640c1f447a 100644 --- a/lib/Transforms/Utils/SimplifyLibCalls.cpp +++ b/lib/Transforms/Utils/SimplifyLibCalls.cpp @@ -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) diff --git a/test/Transforms/InstCombine/memset-1.ll b/test/Transforms/InstCombine/memset-1.ll index 7310e5f4faf..86f3afdef8d 100644 --- a/test/Transforms/InstCombine/memset-1.ll +++ b/test/Transforms/InstCombine/memset-1.ll @@ -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. -- 2.40.0