[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:10:14 PDT 2021


jdoerfert updated this revision to Diff 373287.
jdoerfert added a comment.
Herald added a project: OpenMP.

Add new device runtime user


Repository:
  rG LLVM Github Monorepo

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

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
  openmp/libomptarget/DeviceRTL/include/Types.h


Index: openmp/libomptarget/DeviceRTL/include/Types.h
===================================================================
--- openmp/libomptarget/DeviceRTL/include/Types.h
+++ openmp/libomptarget/DeviceRTL/include/Types.h
@@ -12,6 +12,15 @@
 #ifndef OMPTARGET_TYPES_H
 #define OMPTARGET_TYPES_H
 
+// Tell the compiler that we do not have any "call-like" inline assembly in the
+// device rutime. That means we cannot have inline assembly which will call
+// another function but only inline assembly that performs some operation or
+// side-effect and then continues execution with something on the existing call
+// stack.
+//
+// TODO: Find a good place for this
+#pragma omp assumes ext_no_call_asm
+
 /// Base type declarations for freestanding mode
 ///
 ///{
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.373287.patch
Type: text/x-patch
Size: 3426 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/openmp-commits/attachments/20210917/9621c7b5/attachment.bin>


More information about the Openmp-commits mailing list