[llvm] 4f9217c - [FuncSpec] Don't specialise call sites that have the MinSize attribute set

Sjoerd Meijer via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 10 01:04:52 PDT 2021


Author: Sjoerd Meijer
Date: 2021-09-10T09:01:45+01:00
New Revision: 4f9217c5194b10f8219613506f8d701a24650bbc

URL: https://github.com/llvm/llvm-project/commit/4f9217c5194b10f8219613506f8d701a24650bbc
DIFF: https://github.com/llvm/llvm-project/commit/4f9217c5194b10f8219613506f8d701a24650bbc.diff

LOG: [FuncSpec] Don't specialise call sites that have the MinSize attribute set

The MinSize attribute can be attached to both the callee and the caller
in the callsite. Function specialisation was already skipped for function
declarations (callees) with MinSize. This also skips specialisations for
the callsite when it has MinSize set.

Differential Revision: https://reviews.llvm.org/D109441

Added: 
    llvm/test/Transforms/FunctionSpecialization/function-specialization-minsize2.ll
    llvm/test/Transforms/FunctionSpecialization/function-specialization-minsize3.ll

Modified: 
    llvm/lib/Transforms/IPO/FunctionSpecialization.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/IPO/FunctionSpecialization.cpp b/llvm/lib/Transforms/IPO/FunctionSpecialization.cpp
index dbf4000a7f3b..5dffe2b944ab 100644
--- a/llvm/lib/Transforms/IPO/FunctionSpecialization.cpp
+++ b/llvm/lib/Transforms/IPO/FunctionSpecialization.cpp
@@ -659,6 +659,12 @@ class FunctionSpecializer {
       if (!isa<CallInst>(U) && !isa<InvokeInst>(U))
         continue;
       auto &CS = *cast<CallBase>(U);
+      // If the call site has attribute minsize set, that callsite won't be
+      // specialized.
+      if (CS.hasFnAttr(Attribute::MinSize)) {
+        AllConstant = false;
+        continue;
+      }
 
       // If the parent of the call site will never be executed, we don't need
       // to worry about the passed value.
@@ -688,6 +694,9 @@ class FunctionSpecializer {
   /// This function modifies calls to function \p F whose argument at index \p
   /// ArgNo is equal to constant \p C. The calls are rewritten to call function
   /// \p Clone instead.
+  ///
+  /// Callsites that have been marked with the MinSize function attribute won't
+  /// be specialized and rewritten.
   void rewriteCallSites(Function *F, Function *Clone, Argument &Arg,
                         Constant *C) {
     unsigned ArgNo = Arg.getArgNo();

diff  --git a/llvm/test/Transforms/FunctionSpecialization/function-specialization-minsize2.ll b/llvm/test/Transforms/FunctionSpecialization/function-specialization-minsize2.ll
new file mode 100644
index 000000000000..80ea1a47954e
--- /dev/null
+++ b/llvm/test/Transforms/FunctionSpecialization/function-specialization-minsize2.ll
@@ -0,0 +1,44 @@
+; RUN: opt -function-specialization -func-specialization-size-threshold=3 -S < %s | FileCheck %s
+
+; Checks for callsites that have been annotated with MinSize. No specialisation
+; expected here:
+;
+; CHECK-NOT: @compute.1
+; CHECK-NOT: @compute.2
+
+define i64 @main(i64 %x, i1 %flag) {
+entry:
+  br i1 %flag, label %plus, label %minus
+
+plus:
+  %tmp0 = call i64 @compute(i64 %x, i64 (i64)* @plus) #0
+  br label %merge
+
+minus:
+  %tmp1 = call i64 @compute(i64 %x, i64 (i64)* @minus) #0
+  br label %merge
+
+merge:
+  %tmp2 = phi i64 [ %tmp0, %plus ], [ %tmp1, %minus]
+  ret i64 %tmp2
+}
+
+define internal i64 @compute(i64 %x, i64 (i64)* %binop) {
+entry:
+  %tmp0 = call i64 %binop(i64 %x)
+  ret i64 %tmp0
+}
+
+define internal i64 @plus(i64 %x) {
+entry:
+  %tmp0 = add i64 %x, 1
+  ret i64 %tmp0
+}
+
+define internal i64 @minus(i64 %x) {
+entry:
+  %tmp0 = sub i64 %x, 1
+  ret i64 %tmp0
+}
+
+attributes #0 = { minsize optsize }

diff  --git a/llvm/test/Transforms/FunctionSpecialization/function-specialization-minsize3.ll b/llvm/test/Transforms/FunctionSpecialization/function-specialization-minsize3.ll
new file mode 100644
index 000000000000..4321b2fecc3c
--- /dev/null
+++ b/llvm/test/Transforms/FunctionSpecialization/function-specialization-minsize3.ll
@@ -0,0 +1,48 @@
+; RUN: opt -function-specialization -func-specialization-size-threshold=3 -S < %s | FileCheck %s
+
+; Checks for callsites that have been annotated with MinSize. We only expect
+; specialisation for the call that does not have the attribute:
+;
+; CHECK: plus:
+; CHECK:   %tmp0 = call i64 @compute.1(i64 %x, i64 (i64)* @plus)
+; CHECK:   br label %merge
+; CHECK: minus:
+; CHECK:   %tmp1 = call i64 @compute(i64 %x, i64 (i64)* @minus) #0
+; CHECK:   br label %merge
+;
+define i64 @main(i64 %x, i1 %flag) {
+entry:
+  br i1 %flag, label %plus, label %minus
+
+plus:
+  %tmp0 = call i64 @compute(i64 %x, i64 (i64)* @plus)
+  br label %merge
+
+minus:
+  %tmp1 = call i64 @compute(i64 %x, i64 (i64)* @minus) #0
+  br label %merge
+
+merge:
+  %tmp2 = phi i64 [ %tmp0, %plus ], [ %tmp1, %minus]
+  ret i64 %tmp2
+}
+
+define internal i64 @compute(i64 %x, i64 (i64)* %binop) {
+entry:
+  %tmp0 = call i64 %binop(i64 %x)
+  ret i64 %tmp0
+}
+
+define internal i64 @plus(i64 %x) {
+entry:
+  %tmp0 = add i64 %x, 1
+  ret i64 %tmp0
+}
+
+define internal i64 @minus(i64 %x) {
+entry:
+  %tmp0 = sub i64 %x, 1
+  ret i64 %tmp0
+}
+
+attributes #0 = { minsize optsize }


        


More information about the llvm-commits mailing list