[PATCH] D106707: [OpenMP] Introduce RAII to protect certain RTL calls from DCE

Joseph Huber via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 23 13:44:17 PDT 2021


jhuber6 created this revision.
jhuber6 added a reviewer: jdoerfert.
Herald added subscribers: ormris, uenoku, guansong, hiraditya, yaxunl.
Herald added a reviewer: uenoku.
jhuber6 requested review of this revision.
Herald added a reviewer: sstefan1.
Herald added subscribers: llvm-commits, bbn, sstefan1.
Herald added a reviewer: baziotis.
Herald added a project: LLVM.

This patch introduces a new RAII struct that will temporarily make an OpenMP
RTL function have external linkage. This is done before the attributor is
invoked to prevent it from incorrectly removing some function definitions that
we will use later. For example, if we determine all calls to one function are
dead, because it has internal linkage it can safely be removed. Later when we
try to get an instance to that function to modify the source using
`getOrCreateRuntimeFunction` we will then get an empty declaration for that
function that won't be defined anywhere. This patch prevents this from
occurring.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D106707

Files:
  llvm/lib/Transforms/IPO/OpenMPOpt.cpp


Index: llvm/lib/Transforms/IPO/OpenMPOpt.cpp
===================================================================
--- llvm/lib/Transforms/IPO/OpenMPOpt.cpp
+++ llvm/lib/Transforms/IPO/OpenMPOpt.cpp
@@ -1760,6 +1760,32 @@
           [&]() { return RemarkCB(RemarkKind(DEBUG_TYPE, RemarkName, F)); });
   }
 
+  /// RAII struct to temporarily change an RTL function's linkage to external.
+  /// This prevents it from being mistakenly removed by other optimizations.
+  struct ExternalizationRAII {
+    ExternalizationRAII(OMPInformationCache &OMPInfoCache,
+                        RuntimeFunction RFKind)
+        : OMPInfoCache(OMPInfoCache),
+          Declaration(OMPInfoCache.RFIs[RFKind].Declaration) {
+      if (!Declaration)
+        return;
+
+      LinkageType = Declaration->getLinkage();
+      Declaration->setLinkage(GlobalValue::ExternalLinkage);
+    }
+
+    ~ExternalizationRAII() {
+      if (!Declaration)
+        return;
+
+      Declaration->setLinkage(LinkageType);
+    }
+
+    OMPInformationCache &OMPInfoCache;
+    Function *Declaration;
+    GlobalValue::LinkageTypes LinkageType;
+  };
+
   /// The underlying module.
   Module &M;
 
@@ -1784,6 +1810,16 @@
     if (SCC.empty())
       return false;
 
+    // Temporarily make these function have external linkage so the Attributor
+    // doesn't remove them when we try to look them up later.
+    ExternalizationRAII(OMPInfoCache, OMPRTL___kmpc_kernel_end_parallel);
+    ExternalizationRAII(OMPInfoCache, OMPRTL___kmpc_kernel_parallel);
+    ExternalizationRAII(OMPInfoCache, OMPRTL___kmpc_barrier_simple_spmd);
+    ExternalizationRAII(OMPInfoCache,
+                        OMPRTL___tgt_target_data_begin_mapper_wait);
+    ExternalizationRAII(OMPInfoCache,
+                        OMPRTL___tgt_target_data_begin_mapper_issue);
+
     registerAAs(IsModulePass);
 
     ChangeStatus Changed = A.run();


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D106707.361332.patch
Type: text/x-patch
Size: 1889 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210723/bfe94468/attachment.bin>


More information about the llvm-commits mailing list