[PATCH] D100353: Support optnone in SCCP

David Blaikie via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 13 15:38:15 PDT 2021


dblaikie updated this revision to Diff 337273.
dblaikie added a comment.

Fix misclassification of optnone function as not executed


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D100353

Files:
  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;


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


More information about the llvm-commits mailing list