[PATCH] D100353: Support optnone in SCCP

David Blaikie via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 15 15:54:14 PDT 2021


dblaikie updated this revision to Diff 337925.
dblaikie added a comment.
Herald added a subscriber: jdoerfert.

Update LangRef to clarify/improve the optnone guarantee for interprocedural optimizations.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D100353

Files:
  llvm/docs/LangRef.rst
  llvm/lib/Transforms/Scalar/SCCP.cpp
  llvm/test/Transforms/SCCP/optnone.ll


Index: llvm/test/Transforms/SCCP/optnone.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/SCCP/optnone.ll
@@ -0,0 +1,15 @@
+; RUN: opt < %s -ipsccp -instcombine -S | FileCheck %s
+
+attributes #0 = { noinline optnone }
+
+define i32 @callee() #0 {
+  ret i32 52
+}
+
+define i32 @caller() {
+  ; CHECK: define i32 @caller()
+  ; CHECK: ret i32 %X
+  %X = call i32 @callee()
+  ret i32 %X
+}
+
Index: llvm/lib/Transforms/Scalar/SCCP.cpp
===================================================================
--- llvm/lib/Transforms/Scalar/SCCP.cpp
+++ llvm/lib/Transforms/Scalar/SCCP.cpp
@@ -1207,7 +1207,8 @@
 
   // Otherwise, if we have a single return value case, and if the function is
   // a declaration, maybe we can constant fold it.
-  if (F && F->isDeclaration() && canConstantFoldCallTo(&CB, F)) {
+  if (F && (F->isDeclaration() || F->hasOptNone()) &&
+      canConstantFoldCallTo(&CB, F)) {
     SmallVector<Constant *, 8> Operands;
     for (auto AI = CB.arg_begin(), E = CB.arg_end(); AI != E; ++AI) {
       if (AI->get()->getType()->isStructTy())
@@ -1380,7 +1381,7 @@
   // The common case is that we aren't tracking the callee, either because we
   // are not doing interprocedural analysis or the callee is indirect, or is
   // external.  Handle these cases first.
-  if (!F || F->isDeclaration())
+  if (!F || F->isDeclaration() || F->hasOptNone())
     return handleCallOverdefined(CB);
 
   // If this is a single/zero retval case, see if we're tracking the function.
@@ -1940,6 +1941,10 @@
   for (Function &F : M) {
     if (F.isDeclaration())
       continue;
+    if (F.hasOptNone()) {
+      Solver.MarkBlockExecutable(&F.front());
+      continue;
+    }
 
     Solver.addAnalysis(F, getAnalysis(F));
 
@@ -1992,7 +1997,7 @@
   // constants if we have found them to be of constant values.
 
   for (Function &F : M) {
-    if (F.isDeclaration())
+    if (F.isDeclaration() || F.hasOptNone())
       continue;
 
     SmallVector<BasicBlock *, 512> BlocksToErase;
Index: llvm/docs/LangRef.rst
===================================================================
--- llvm/docs/LangRef.rst
+++ llvm/docs/LangRef.rst
@@ -1655,11 +1655,11 @@
     for maximum fuzzing signal.
 ``optnone``
     This function attribute indicates that most optimization passes will skip
-    this function, with the exception of interprocedural optimization passes.
-    Code generation defaults to the "fast" instruction selector.
-    This attribute cannot be used together with the ``alwaysinline``
-    attribute; this attribute is also incompatible
-    with the ``minsize`` attribute and the ``optsize`` attribute.
+    this function. Interprocedural optimizations should treat this function as
+    though it were defined in an isolated module/object. Code generation
+    defaults to the "fast" instruction selector. This attribute cannot be used
+    together with the ``alwaysinline`` attribute; this attribute is also
+    incompatible with the ``minsize`` attribute and the ``optsize`` attribute.
 
     This attribute requires the ``noinline`` attribute to be specified on
     the function as well, so the function is never inlined into any caller.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D100353.337925.patch
Type: text/x-patch
Size: 3224 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210415/dd43e758/attachment.bin>


More information about the llvm-commits mailing list