[llvm] [Inliner] Don't count a call penalty for foldable __memcpy_chk and similar (PR #117876)

Marina Taylor via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 28 07:07:00 PST 2024


================
@@ -2260,6 +2271,45 @@ bool CallAnalyzer::simplifyCallSite(Function *F, CallBase &Call) {
   return false;
 }
 
+bool CallAnalyzer::isLoweredToCall(Function *F, CallBase &Call) {
+  const TargetLibraryInfo *TLI = GetTLI ? &GetTLI(*F) : nullptr;
+  LibFunc LF;
+  if (!TLI || !TLI->getLibFunc(*F, LF) || !TLI->has(LF))
+    return TTI.isLoweredToCall(F);
+
+  switch (LF) {
+  case LibFunc_memcpy_chk:
+  case LibFunc_memmove_chk:
+  case LibFunc_mempcpy_chk:
+  case LibFunc_memset_chk:
+    // Calls to  __memcpy_chk whose length is known to fit within the object
+    // size will eventually be replaced by inline stores. Therefore, these
+    // should not incur a call penalty. This is only really relevant on
+    // platforms whose headers redirect memcpy to __memcpy_chk (e.g. Mac), as
+    // other platforms use memcpy intrinsics, which are already exempt from the
+    // call penalty.
+    {
----------------
citymarina wrote:

In an earlier iteration of this patch, I had to do this to avoid some ridiculous clang-format result, but it seems like things are OK now. Fixed.

https://github.com/llvm/llvm-project/pull/117876


More information about the llvm-commits mailing list