aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/Utils/BuildLibCalls.cpp
diff options
context:
space:
mode:
authorMartin Sebor <msebor@redhat.com>2022-07-01 10:09:42 -0600
committerMartin Sebor <msebor@redhat.com>2022-07-01 11:10:00 -0600
commit0d68ff87d2b03522ac43646a491d731586518e4c (patch)
tree9f2e7c47b9550a87413668ceb6a3b30e8e548b8c /llvm/lib/Transforms/Utils/BuildLibCalls.cpp
parent554aea52d79ebd9353911ecf2ffe14aca132f452 (diff)
downloadllvm-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.cpp10
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();