[Openmp-commits] [PATCH] D109986: [Attributor][OpenMP] Add assumption for non-call assembly instructions

Johannes Doerfert via Phabricator via Openmp-commits openmp-commits at lists.llvm.org
Fri Sep 17 11:07:05 PDT 2021


jdoerfert created this revision.
jdoerfert added reviewers: kuter, jhuber6, ggeorgakoudis, tianshilei1992.
Herald added subscribers: ormris, dexonsmith, okura, uenoku, guansong, bollu, hiraditya, yaxunl.
Herald added a reviewer: uenoku.
Herald added a reviewer: homerdin.
jdoerfert requested review of this revision.
Herald added a reviewer: sstefan1.
Herald added subscribers: llvm-commits, sstefan1.
Herald added a reviewer: baziotis.
Herald added a project: LLVM.

Inline assembly is scary but we need to support it for the OpenMP GPU
device runtime. The new assumption expresses the fact that it may not
have call semantics, that is, it will not call another function but
simply perform an operation or side-effect. This is important for
reachability in the presence of inline assembly.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D109986

Files:
  llvm/include/llvm/IR/Assumptions.h
  llvm/lib/IR/Assumptions.cpp
  llvm/lib/Transforms/IPO/AttributorAttributes.cpp
  llvm/test/Transforms/Attributor/reachability.ll


Index: llvm/test/Transforms/Attributor/reachability.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/Attributor/reachability.ll
@@ -0,0 +1,20 @@
+
+define dso_local void @non_recursive_asm_fn() #0 {
+entry:
+  call void asm sideeffect "barrier.sync $0;", "r,~{memory},~{dirflag},~{fpsr},~{flags}"(i32 1)
+  ret void
+}
+
+define dso_local void @non_recursive_asm_cs() {
+entry:
+  call void asm sideeffect "barrier.sync $0;", "r,~{memory},~{dirflag},~{fpsr},~{flags}"(i32 1) #0
+  ret void
+}
+
+define dso_local void @recursive_asm() {
+entry:
+  call void asm sideeffect "barrier.sync $0;", "r,~{memory},~{dirflag},~{fpsr},~{flags}"(i32 1)
+  ret void
+}
+
+attributes #0 = { "llvm.assume"="ompx_no_call_asm" }
Index: llvm/lib/Transforms/IPO/AttributorAttributes.cpp
===================================================================
--- llvm/lib/Transforms/IPO/AttributorAttributes.cpp
+++ llvm/lib/Transforms/IPO/AttributorAttributes.cpp
@@ -30,6 +30,7 @@
 #include "llvm/Analysis/TargetTransformInfo.h"
 #include "llvm/Analysis/ValueTracking.h"
 #include "llvm/IR/Argument.h"
+#include "llvm/IR/Assumptions.h"
 #include "llvm/IR/Constants.h"
 #include "llvm/IR/IRBuilder.h"
 #include "llvm/IR/Instruction.h"
@@ -9696,7 +9697,9 @@
     CallBase *CB = static_cast<CallBase *>(getCtxI());
 
     if (CB->isInlineAsm()) {
-      setHasUnknownCallee(false, Change);
+      if (!hasAssumption(*CB->getCaller(), "ompx_no_call_asm") &&
+          !hasAssumption(*CB, "ompx_no_call_asm"))
+        setHasUnknownCallee(false, Change);
       return Change;
     }
 
Index: llvm/lib/IR/Assumptions.cpp
===================================================================
--- llvm/lib/IR/Assumptions.cpp
+++ llvm/lib/IR/Assumptions.cpp
@@ -52,4 +52,5 @@
     "omp_no_openmp_routines", // OpenMP 5.1
     "omp_no_parallelism",     // OpenMP 5.1
     "ompx_spmd_amenable",     // OpenMPOpt extension
+    "ompx_no_call_asm",       // OpenMPOpt extension
 });
Index: llvm/include/llvm/IR/Assumptions.h
===================================================================
--- llvm/include/llvm/IR/Assumptions.h
+++ llvm/include/llvm/IR/Assumptions.h
@@ -33,6 +33,10 @@
 /// Helper that allows to insert a new assumption string in the known assumption
 /// set by creating a (static) object.
 struct KnownAssumptionString {
+  KnownAssumptionString(const char *AssumptionStr)
+      : AssumptionStr(AssumptionStr) {
+    KnownAssumptionStrings.insert(AssumptionStr);
+  }
   KnownAssumptionString(StringRef AssumptionStr)
       : AssumptionStr(AssumptionStr) {
     KnownAssumptionStrings.insert(AssumptionStr);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D109986.373286.patch
Type: text/x-patch
Size: 2661 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/openmp-commits/attachments/20210917/3415b9cf/attachment-0001.bin>


More information about the Openmp-commits mailing list