diff options
author | Martin Sebor <msebor@redhat.com> | 2022-07-01 10:09:42 -0600 |
---|---|---|
committer | Martin Sebor <msebor@redhat.com> | 2022-07-01 11:10:00 -0600 |
commit | 0d68ff87d2b03522ac43646a491d731586518e4c (patch) | |
tree | 9f2e7c47b9550a87413668ceb6a3b30e8e548b8c /llvm/lib/Transforms/Utils/BuildLibCalls.cpp | |
parent | 554aea52d79ebd9353911ecf2ffe14aca132f452 (diff) | |
download | llvm-0d68ff87d2b03522ac43646a491d731586518e4c.zip llvm-0d68ff87d2b03522ac43646a491d731586518e4c.tar.gz llvm-0d68ff87d2b03522ac43646a491d731586518e4c.tar.bz2 |
[InstCombine] Transform strrchr to memrchr for constant strings
Add an emitter for the memrchr common extension and simplify the strrchr
call handler to use it. This enables transforming calls with the empty
string to the test C ? S : 0.
Reviewed By: nikic
Differential Revision: https://reviews.llvm.org/D128954
Diffstat (limited to 'llvm/lib/Transforms/Utils/BuildLibCalls.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/BuildLibCalls.cpp | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/BuildLibCalls.cpp b/llvm/lib/Transforms/Utils/BuildLibCalls.cpp index 666b276..c4a58f3 100644 --- a/llvm/lib/Transforms/Utils/BuildLibCalls.cpp +++ b/llvm/lib/Transforms/Utils/BuildLibCalls.cpp @@ -1305,6 +1305,7 @@ FunctionCallee llvm::getOrInsertLibFunc(Module *M, const TargetLibraryInfo &TLI, case LibFunc_ldexpf: case LibFunc_ldexpl: case LibFunc_memchr: + case LibFunc_memrchr: case LibFunc_strchr: setArgExtAttr(*F, 1, TLI); break; @@ -1538,6 +1539,15 @@ Value *llvm::emitMemChr(Value *Ptr, Value *Val, Value *Len, IRBuilderBase &B, {castToCStr(Ptr, B), Val, Len}, B, TLI); } +Value *llvm::emitMemRChr(Value *Ptr, Value *Val, Value *Len, IRBuilderBase &B, + const DataLayout &DL, const TargetLibraryInfo *TLI) { + LLVMContext &Context = B.GetInsertBlock()->getContext(); + return emitLibCall( + LibFunc_memrchr, B.getInt8PtrTy(), + {B.getInt8PtrTy(), B.getInt32Ty(), DL.getIntPtrType(Context)}, + {castToCStr(Ptr, B), Val, Len}, B, TLI); +} + Value *llvm::emitMemCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI) { LLVMContext &Context = B.GetInsertBlock()->getContext(); |