[PATCH] D104810: [Inline] prevent inlining on noprofile mismatch

Nick Desaulniers via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 25 17:32:31 PDT 2021


nickdesaulniers updated this revision to Diff 354636.
nickdesaulniers edited the summary of this revision.
nickdesaulniers added a comment.

- langref addition for noprofile, test alwaysinline callsite


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D104810/new/

https://reviews.llvm.org/D104810

Files:
  llvm/docs/LangRef.rst
  llvm/include/llvm/IR/Attributes.td
  llvm/test/Transforms/Inline/inline_noprofile.ll


Index: llvm/test/Transforms/Inline/inline_noprofile.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/Inline/inline_noprofile.ll
@@ -0,0 +1,44 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -passes=inline %s -S -pass-remarks-missed=inline 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-INLINE
+; RUN: opt -passes=always-inline %s -S | FileCheck %s
+
+; Test that we don't inline when caller and callee don't have matching
+; noprofile fn attrs.
+
+; CHECK-INLINE: profile not inlined into profile_caller because it should never be inlined (cost=never): conflicting attributes
+; CHECK-INLINE: noprofile not inlined into noprofile_caller because it should never be inlined (cost=never): conflicting attributes
+
+define i32 @profile() { ret i32 42 }
+define i32 @noprofile() noprofile { ret i32 43 }
+define i32 @profile_aa() alwaysinline { ret i32 44 }
+define i32 @noprofile_aa() noprofile alwaysinline { ret i32 45 }
+
+define i32 @profile_caller() noprofile {
+; CHECK-LABEL: @profile_caller(
+; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @profile()
+; CHECK-NEXT:    ret i32 44
+;
+  call i32 @profile()
+  %2 = call i32 @profile_aa()
+  ret i32 %2
+}
+
+define i32 @noprofile_caller() {
+; CHECK-LABEL: @noprofile_caller(
+; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @noprofile()
+; CHECK-NEXT:    ret i32 45
+;
+  call i32 @noprofile()
+  %2 = call i32 @noprofile_aa()
+  ret i32 %2
+}
+
+; Test that we do inline when caller and callee don't have matching
+; noprofile fn attrs, when CallInst is alwaysinline.
+define i32 @aa_callsite() {
+; CHECK-INLINE-LABEL: @aa_callsite(
+; CHECK-INLINE-NEXT:    ret i32 43
+;
+  %1 = call i32 @noprofile() alwaysinline
+  ret i32 %1
+}
Index: llvm/include/llvm/IR/Attributes.td
===================================================================
--- llvm/include/llvm/IR/Attributes.td
+++ llvm/include/llvm/IR/Attributes.td
@@ -297,6 +297,7 @@
 def : CompatRule<"isEqual<SafeStackAttr>">;
 def : CompatRule<"isEqual<ShadowCallStackAttr>">;
 def : CompatRule<"isEqual<UseSampleProfileAttr>">;
+def : CompatRule<"isEqual<NoProfileAttr>">;
 
 class MergeRule<string F> {
   // The name of the function called to merge the attributes of the caller and
Index: llvm/docs/LangRef.rst
===================================================================
--- llvm/docs/LangRef.rst
+++ llvm/docs/LangRef.rst
@@ -1656,6 +1656,13 @@
     This attribute suppresses lazy symbol binding for the function. This
     may make calls to the function faster, at the cost of extra program
     startup time if the function is not called during program startup.
+``noprofile``
+    This function attribute prevents instrumentation based profiling, used for
+    coverage or profile based optimization, from being added to a function.  A
+    function with the ``noprofile`` attribute but without the ``alwaysinline``
+    attribute cannot be inlined into a function without a ``noprofile``
+    attribute. ``call``, ``invoke``, and ``callbr`` instructions with the
+    ``alwaysinline`` attribute force inlining.
 ``noredzone``
     This attribute indicates that the code generator should not use a
     red zone, even if the target-specific ABI normally permits it.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D104810.354636.patch
Type: text/x-patch
Size: 3288 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210626/892f8e1c/attachment.bin>


More information about the llvm-commits mailing list