diff options
| author | Dimitry Andric <dimitry@andric.com> | 2019-11-13 22:15:30 +0100 |
|---|---|---|
| committer | Dimitry Andric <dimitry@andric.com> | 2019-11-14 08:04:36 +0100 |
| commit | 3db6783d8a7da05a5949bb18e6c8809306c9d0de (patch) | |
| tree | d9d7733fcb01e6a10c8136b9aab59e2ee152d67d /llvm | |
| parent | feee1d58dcd8945c5d121419bb59ce4b1e0d6214 (diff) | |
| download | bcm5719-llvm-3db6783d8a7da05a5949bb18e6c8809306c9d0de.tar.gz bcm5719-llvm-3db6783d8a7da05a5949bb18e6c8809306c9d0de.zip | |
Check result of emitStrLen before passing it to CreateGEP
Summary:
This fixes PR43081, where the transformation of `strchr(p, 0) -> p +
strlen(p)` can cause a segfault, if `-fno-builtin-strlen` is used. In
that case, `emitStrLen` returns nullptr, which CreateGEP is not designed
to handle. Also add the minimized code from the PR as a test case.
Reviewers: xbolva00, spatel, jdoerfert, efriedma
Reviewed By: efriedma
Subscribers: lebedev.ri, hiraditya, cfe-commits, llvm-commits
Tags: #clang, #llvm
Differential Revision: https://reviews.llvm.org/D70143
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp | 4 | ||||
| -rw-r--r-- | llvm/test/Transforms/InstCombine/pr43081.ll | 15 |
2 files changed, 17 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp index 0324993a820..18a17119b47 100644 --- a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp @@ -364,8 +364,8 @@ Value *LibCallSimplifier::optimizeStrChr(CallInst *CI, IRBuilder<> &B) { StringRef Str; if (!getConstantStringInfo(SrcStr, Str)) { if (CharC->isZero()) // strchr(p, 0) -> p + strlen(p) - return B.CreateGEP(B.getInt8Ty(), SrcStr, emitStrLen(SrcStr, B, DL, TLI), - "strchr"); + if (Value *StrLen = emitStrLen(SrcStr, B, DL, TLI)) + return B.CreateGEP(B.getInt8Ty(), SrcStr, StrLen, "strchr"); return nullptr; } diff --git a/llvm/test/Transforms/InstCombine/pr43081.ll b/llvm/test/Transforms/InstCombine/pr43081.ll new file mode 100644 index 00000000000..42f910043db --- /dev/null +++ b/llvm/test/Transforms/InstCombine/pr43081.ll @@ -0,0 +1,15 @@ +; RUN: opt < %s -instcombine -disable-builtin strlen -S | FileCheck %s + +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-s0:64:64-f80:128:128-n8:16:32:64-S128" + +declare i8* @strchr(i8*, i32) + +define i8* @pr43081(i8* %a) { +entry: + %a.addr = alloca i8*, align 8 + store i8* %a, i8** %a.addr, align 8 + %0 = load i8*, i8** %a.addr, align 8 + %call = call i8* @strchr(i8* %0, i32 0) + ret i8* %call +; CHECK: call i8* @strchr +} |

