[llvm] a70ef3f - Revert "[AbstractAttributor] Fold function calls to `__kmpc_is_spmd_exec_mode` if possible"

Shilei Tian via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 15 08:19:42 PDT 2021


Author: Shilei Tian
Date: 2021-07-15T11:19:28-04:00
New Revision: a70ef3f568cb7ce963aeb04000d3c29699ee1c47

URL: https://github.com/llvm/llvm-project/commit/a70ef3f568cb7ce963aeb04000d3c29699ee1c47
DIFF: https://github.com/llvm/llvm-project/commit/a70ef3f568cb7ce963aeb04000d3c29699ee1c47.diff

LOG: Revert "[AbstractAttributor] Fold function calls to `__kmpc_is_spmd_exec_mode` if possible"

This reverts commit 1100e4aafea233bc8bbc307c5758a7d287ad3bae.

Added: 
    

Modified: 
    llvm/lib/Transforms/IPO/OpenMPOpt.cpp
    llvm/test/Transforms/OpenMP/custom_state_machines.ll

Removed: 
    llvm/test/Transforms/OpenMP/is_spmd_exec_mode_fold.ll


################################################################################
diff  --git a/llvm/lib/Transforms/IPO/OpenMPOpt.cpp b/llvm/lib/Transforms/IPO/OpenMPOpt.cpp
index e0d7abc6cfc16..e90bb8846f418 100644
--- a/llvm/lib/Transforms/IPO/OpenMPOpt.cpp
+++ b/llvm/lib/Transforms/IPO/OpenMPOpt.cpp
@@ -497,12 +497,6 @@ struct KernelInfoState : AbstractState {
   /// one we abort as the kernel is malformed.
   CallBase *KernelDeinitCB = nullptr;
 
-  /// Flag to indicate if the associated function is a kernel entry.
-  bool IsKernelEntry = false;
-
-  /// State to track what kernel entries can reach the associated function.
-  BooleanStateWithPtrSetVector<Function> ReachingKernelEntries;
-
   /// Abstract State interface
   ///{
 
@@ -543,8 +537,6 @@ struct KernelInfoState : AbstractState {
       return false;
     if (ReachedUnknownParallelRegions != RHS.ReachedUnknownParallelRegions)
       return false;
-    if (ReachingKernelEntries != RHS.ReachingKernelEntries)
-      return false;
     return true;
   }
 
@@ -2737,10 +2729,6 @@ struct AAKernelInfoFunction : AAKernelInfo {
     if (!OMPInfoCache.Kernels.count(Fn))
       return;
 
-    // Add itself to the reaching kernel and set IsKernelEntry.
-    ReachingKernelEntries.insert(Fn);
-    IsKernelEntry = true;
-
     OMPInformationCache::RuntimeFunctionInfo &InitRFI =
         OMPInfoCache.RFIs[OMPRTL___kmpc_target_init];
     OMPInformationCache::RuntimeFunctionInfo &DeinitRFI =
@@ -3225,9 +3213,6 @@ struct AAKernelInfoFunction : AAKernelInfo {
             CheckRWInst, *this, UsedAssumedInformationInCheckRWInst))
       SPMDCompatibilityTracker.indicatePessimisticFixpoint();
 
-    if (!IsKernelEntry)
-      updateReachingKernelEntries(A);
-
     // Callback to check a call instruction.
     auto CheckCallInst = [&](Instruction &I) {
       auto &CB = cast<CallBase>(I);
@@ -3235,19 +3220,6 @@ struct AAKernelInfoFunction : AAKernelInfo {
           *this, IRPosition::callsite_function(CB), DepClassTy::OPTIONAL);
       if (CBAA.getState().isValidState())
         getState() ^= CBAA.getState();
-
-      Function *Callee = CB.getCalledFunction();
-      if (Callee) {
-        // We need to propagate information to the callee, but since the
-        // construction of AA always starts with kernel entries, we have to
-        // create AAKernelInfoFunction for all called functions. However, here
-        // the caller doesn't depend on the callee.
-        // TODO: We might want to change the dependence here later if we need
-        // information from callee to caller.
-        A.getOrCreateAAFor<AAKernelInfo>(IRPosition::function(*Callee), this,
-                                         DepClassTy::NONE);
-      }
-
       return true;
     };
 
@@ -3259,35 +3231,6 @@ struct AAKernelInfoFunction : AAKernelInfo {
     return StateBefore == getState() ? ChangeStatus::UNCHANGED
                                      : ChangeStatus::CHANGED;
   }
-
-private:
-  /// Update info regarding reaching kernels.
-  void updateReachingKernelEntries(Attributor &A) {
-    auto PredCallSite = [&](AbstractCallSite ACS) {
-      Function *Caller = ACS.getInstruction()->getFunction();
-
-      assert(Caller && "Caller is nullptr");
-
-      auto &CAA =
-          A.getOrCreateAAFor<AAKernelInfo>(IRPosition::function(*Caller));
-      if (CAA.isValidState()) {
-        ReachingKernelEntries ^= CAA.ReachingKernelEntries;
-        return true;
-      }
-
-      // We lost track of the caller of the associated function, any kernel
-      // could reach now.
-      ReachingKernelEntries.indicatePessimisticFixpoint();
-
-      return true;
-    };
-
-    bool AllCallSitesKnown;
-    if (!A.checkForAllCallSites(PredCallSite, *this,
-                                true /* RequireAllCallSites */,
-                                AllCallSitesKnown))
-      ReachingKernelEntries.indicatePessimisticFixpoint();
-  }
 };
 
 /// The call site kernel info abstract attribute, basically, what can we say
@@ -3434,180 +3377,6 @@ struct AAKernelInfoCallSite : AAKernelInfo {
   }
 };
 
-struct AAFoldRuntimeCall
-    : public StateWrapper<BooleanState, AbstractAttribute> {
-  using Base = StateWrapper<BooleanState, AbstractAttribute>;
-
-  AAFoldRuntimeCall(const IRPosition &IRP, Attributor &A) : Base(IRP) {}
-
-  /// Statistics are tracked as part of manifest for now.
-  void trackStatistics() const override {}
-
-  /// Create an abstract attribute biew for the position \p IRP.
-  static AAFoldRuntimeCall &createForPosition(const IRPosition &IRP,
-                                              Attributor &A);
-
-  /// See AbstractAttribute::getName()
-  const std::string getName() const override { return "AAFoldRuntimeCall"; }
-
-  /// See AbstractAttribute::getIdAddr()
-  const char *getIdAddr() const override { return &ID; }
-
-  /// This function should return true if the type of the \p AA is
-  /// AAFoldRuntimeCall
-  static bool classof(const AbstractAttribute *AA) {
-    return (AA->getIdAddr() == &ID);
-  }
-
-  static const char ID;
-};
-
-struct AAFoldRuntimeCallCallSite : AAFoldRuntimeCall {
-  AAFoldRuntimeCallCallSite(const IRPosition &IRP, Attributor &A)
-      : AAFoldRuntimeCall(IRP, A) {}
-
-  /// See AbstractAttribute::getAsStr()
-  const std::string getAsStr() const override {
-    if (!isValidState())
-      return "<invalid>";
-
-    std::string Str("simplified value: ");
-
-    if (!SimplifiedValue.hasValue())
-      return Str + std::string("none");
-
-    if (!SimplifiedValue.getValue())
-      return Str + std::string("nullptr");
-
-    if (ConstantInt *CI = dyn_cast<ConstantInt>(SimplifiedValue.getValue()))
-      return Str + std::to_string(CI->getSExtValue());
-
-    return Str + std::string("unknown");
-  }
-
-  void initialize(Attributor &A) override {
-    Function *Callee = getAssociatedFunction();
-
-    auto &OMPInfoCache = static_cast<OMPInformationCache &>(A.getInfoCache());
-    const auto &It = OMPInfoCache.RuntimeFunctionIDMap.find(Callee);
-    assert(It != OMPInfoCache.RuntimeFunctionIDMap.end() &&
-           "Expected a known OpenMP runtime function");
-
-    RFKind = It->getSecond();
-
-    CallBase &CB = cast<CallBase>(getAssociatedValue());
-    A.registerSimplificationCallback(
-        IRPosition::callsite_returned(CB),
-        [&](const IRPosition &IRP, const AbstractAttribute *AA,
-            bool &UsedAssumedInformation) -> Optional<Value *> {
-          if (!isAtFixpoint()) {
-            UsedAssumedInformation = true;
-            if (AA)
-              A.recordDependence(*this, *AA, DepClassTy::OPTIONAL);
-          }
-          return SimplifiedValue;
-        });
-  }
-
-  ChangeStatus updateImpl(Attributor &A) override {
-    ChangeStatus Changed = ChangeStatus::UNCHANGED;
-
-    switch (RFKind) {
-    case OMPRTL___kmpc_is_spmd_exec_mode:
-      Changed = Changed | foldIsSPMDExecMode(A);
-      break;
-    default:
-      llvm_unreachable("Unhandled OpenMP runtime function!");
-    }
-
-    return Changed;
-  }
-
-  ChangeStatus manifest(Attributor &A) override {
-    ChangeStatus Changed = ChangeStatus::UNCHANGED;
-
-    if (SimplifiedValue.hasValue() && SimplifiedValue.getValue()) {
-      Instruction &CB = *getCtxI();
-      A.changeValueAfterManifest(CB, **SimplifiedValue);
-      A.deleteAfterManifest(CB);
-      Changed = ChangeStatus::CHANGED;
-    }
-
-    return Changed;
-  }
-
-private:
-  /// Fold __kmpc_is_spmd_exec_mode into a constant if possible.
-  ChangeStatus foldIsSPMDExecMode(Attributor &A) {
-    BooleanState StateBefore = getState();
-
-    unsigned AssumedSPMDCount = 0, KnownSPMDCount = 0;
-    unsigned AssumedNonSPMDCount = 0, KnownNonSPMDCount = 0;
-    auto &CallerKernelInfoAA = A.getAAFor<AAKernelInfo>(
-        *this, IRPosition::function(*getAnchorScope()), DepClassTy::REQUIRED);
-
-    for (Kernel K : CallerKernelInfoAA.ReachingKernelEntries) {
-      auto &AA = A.getAAFor<AAKernelInfo>(*this, IRPosition::function(*K),
-                                          DepClassTy::REQUIRED);
-
-      if (!AA.isValidState()) {
-        SimplifiedValue = nullptr;
-        return indicatePessimisticFixpoint();
-      }
-
-      if (AA.SPMDCompatibilityTracker.isAssumed()) {
-        if (AA.SPMDCompatibilityTracker.isAtFixpoint())
-          ++KnownSPMDCount;
-        else
-          ++AssumedSPMDCount;
-      } else {
-        if (AA.SPMDCompatibilityTracker.isAtFixpoint())
-          ++KnownNonSPMDCount;
-        else
-          ++AssumedNonSPMDCount;
-      }
-    }
-
-    if (KnownSPMDCount && KnownNonSPMDCount) {
-      SimplifiedValue = nullptr;
-      return getState() == StateBefore ? ChangeStatus::UNCHANGED
-                                       : ChangeStatus::CHANGED;
-    }
-
-    if (AssumedSPMDCount && AssumedNonSPMDCount) {
-      SimplifiedValue = nullptr;
-      return getState() == StateBefore ? ChangeStatus::UNCHANGED
-                                       : ChangeStatus::CHANGED;
-    }
-
-    auto &Ctx = getAnchorValue().getContext();
-    if (KnownSPMDCount || AssumedSPMDCount) {
-      assert(KnownNonSPMDCount == 0 && AssumedNonSPMDCount == 0 &&
-             "Expected only SPMD kernels!");
-      // All reaching kernels are in SPMD mode. Update all function calls to
-      // __kmpc_is_spmd_exec_mode to 1.
-      SimplifiedValue = ConstantInt::get(Type::getInt8Ty(Ctx), true);
-    } else {
-      assert(KnownSPMDCount == 0 && AssumedSPMDCount == 0 &&
-             "Expected only non-SPMD kernels!");
-      // All reaching kernels are in non-SPMD mode. Update all function
-      // calls to __kmpc_is_spmd_exec_mode to 0.
-      SimplifiedValue = ConstantInt::get(Type::getInt8Ty(Ctx), false);
-    }
-
-    return getState() == StateBefore ? ChangeStatus::UNCHANGED
-                                     : ChangeStatus::CHANGED;
-  }
-
-  /// An optional value the associated value is assumed to fold to. That is, we
-  /// assume the associated value (which is a call) can be replaced by this
-  /// simplified value.
-  Optional<Value *> SimplifiedValue;
-
-  /// The runtime function kind of the callee of the associated call site.
-  RuntimeFunction RFKind;
-};
-
 } // namespace
 
 void OpenMPOpt::registerAAs(bool IsModulePass) {
@@ -3624,18 +3393,6 @@ void OpenMPOpt::registerAAs(bool IsModulePass) {
           IRPosition::function(*Kernel), /* QueryingAA */ nullptr,
           DepClassTy::NONE, /* ForceUpdate */ false,
           /* UpdateAfterInit */ false);
-
-    auto &IsSPMDRFI = OMPInfoCache.RFIs[OMPRTL___kmpc_is_spmd_exec_mode];
-    IsSPMDRFI.foreachUse(SCC, [&](Use &U, Function &) {
-      CallInst *CI = OpenMPOpt::getCallIfRegularCall(U, &IsSPMDRFI);
-      if (!CI)
-        return false;
-      A.getOrCreateAAFor<AAFoldRuntimeCall>(
-          IRPosition::callsite_function(*CI), /* QueryingAA */ nullptr,
-          DepClassTy::NONE, /* ForceUpdate */ false,
-          /* UpdateAfterInit */ false);
-      return false;
-    });
   }
 
   // Create CallSite AA for all Getters.
@@ -3679,7 +3436,6 @@ const char AAICVTracker::ID = 0;
 const char AAKernelInfo::ID = 0;
 const char AAExecutionDomain::ID = 0;
 const char AAHeapToShared::ID = 0;
-const char AAFoldRuntimeCall::ID = 0;
 
 AAICVTracker &AAICVTracker::createForPosition(const IRPosition &IRP,
                                               Attributor &A) {
@@ -3771,26 +3527,6 @@ AAKernelInfo &AAKernelInfo::createForPosition(const IRPosition &IRP,
   return *AA;
 }
 
-AAFoldRuntimeCall &AAFoldRuntimeCall::createForPosition(const IRPosition &IRP,
-                                                        Attributor &A) {
-  AAFoldRuntimeCall *AA = nullptr;
-  switch (IRP.getPositionKind()) {
-  case IRPosition::IRP_INVALID:
-  case IRPosition::IRP_FLOAT:
-  case IRPosition::IRP_ARGUMENT:
-  case IRPosition::IRP_RETURNED:
-  case IRPosition::IRP_CALL_SITE_RETURNED:
-  case IRPosition::IRP_CALL_SITE_ARGUMENT:
-  case IRPosition::IRP_FUNCTION:
-    llvm_unreachable("KernelInfo can only be created for call site position!");
-  case IRPosition::IRP_CALL_SITE:
-    AA = new (A.Allocator) AAFoldRuntimeCallCallSite(IRP, A);
-    break;
-  }
-
-  return *AA;
-}
-
 PreservedAnalyses OpenMPOptPass::run(Module &M, ModuleAnalysisManager &AM) {
   if (!containsOpenMP(M))
     return PreservedAnalyses::all();

diff  --git a/llvm/test/Transforms/OpenMP/custom_state_machines.ll b/llvm/test/Transforms/OpenMP/custom_state_machines.ll
index 9195b87fb8e82..f2e5e59ad5dcb 100644
--- a/llvm/test/Transforms/OpenMP/custom_state_machines.ll
+++ b/llvm/test/Transforms/OpenMP/custom_state_machines.ll
@@ -1713,8 +1713,8 @@ attributes #10 = { convergent nounwind readonly willreturn }
 ; CHECK:       if.end:
 ; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[A_ADDR]], align 4
 ; CHECK-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP1]], 1
-; CHECK-NEXT:    call void @simple_state_machine_interprocedural_nested_recursive_after.internalized(i32 [[SUB]]) #[[ATTR7]]
-; CHECK-NEXT:    call void @simple_state_machine_interprocedural_nested_recursive_after_after.internalized() #[[ATTR7]]
+; CHECK-NEXT:    call void @simple_state_machine_interprocedural_nested_recursive_after.internalized(i32 [[SUB]]) #[[ATTR8]]
+; CHECK-NEXT:    call void @simple_state_machine_interprocedural_nested_recursive_after_after.internalized() #[[ATTR8]]
 ; CHECK-NEXT:    br label [[RETURN]]
 ; CHECK:       return:
 ; CHECK-NEXT:    ret void

diff  --git a/llvm/test/Transforms/OpenMP/is_spmd_exec_mode_fold.ll b/llvm/test/Transforms/OpenMP/is_spmd_exec_mode_fold.ll
deleted file mode 100644
index 92cdc2ebe1aca..0000000000000
--- a/llvm/test/Transforms/OpenMP/is_spmd_exec_mode_fold.ll
+++ /dev/null
@@ -1,180 +0,0 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-globals
-; RUN: opt -S -passes=openmp-opt < %s | FileCheck %s
-target triple = "nvptx64"
-
-%struct.ident_t = type { i32, i32, i32, i32, i8* }
-
- at is_spmd_exec_mode = weak constant i8 0
- at will_be_spmd_exec_mode = weak constant i8 1
- at non_spmd_exec_mode = weak constant i8 1
- at will_not_be_spmd_exec_mode = weak constant i8 1
- at G = external global i8
- at llvm.compiler.used = appending global [4 x i8*] [i8* @is_spmd_exec_mode, i8* @will_be_spmd_exec_mode, i8* @non_spmd_exec_mode, i8* @will_not_be_spmd_exec_mode ], section "llvm.metadata"
-
-;.
-; CHECK: @[[IS_SPMD_EXEC_MODE:[a-zA-Z0-9_$"\\.-]+]] = weak constant i8 0
-; CHECK: @[[WILL_BE_SPMD_EXEC_MODE:[a-zA-Z0-9_$"\\.-]+]] = weak constant i8 0
-; CHECK: @[[NON_SPMD_EXEC_MODE:[a-zA-Z0-9_$"\\.-]+]] = weak constant i8 1
-; CHECK: @[[WILL_NOT_BE_SPMD_EXEC_MODE:[a-zA-Z0-9_$"\\.-]+]] = weak constant i8 1
-; CHECK: @[[G:[a-zA-Z0-9_$"\\.-]+]] = external global i8
-; CHECK: @[[LLVM_COMPILER_USED:[a-zA-Z0-9_$"\\.-]+]] = appending global [4 x i8*] [i8* @is_spmd_exec_mode, i8* @will_be_spmd_exec_mode, i8* @non_spmd_exec_mode, i8* @will_not_be_spmd_exec_mode], section "llvm.metadata"
-;.
-define weak void @is_spmd() {
-; CHECK-LABEL: define {{[^@]+}}@is_spmd() {
-; CHECK-NEXT:    [[I:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* null, i1 true, i1 false, i1 false)
-; CHECK-NEXT:    call void @is_spmd_helper1()
-; CHECK-NEXT:    call void @is_spmd_helper2()
-; CHECK-NEXT:    call void @is_mixed_helper()
-; CHECK-NEXT:    call void @__kmpc_target_deinit(%struct.ident_t* null, i1 true, i1 false)
-; CHECK-NEXT:    ret void
-;
-  %i = call i32 @__kmpc_target_init(%struct.ident_t* null, i1 true, i1 false, i1 false)
-  call void @is_spmd_helper1()
-  call void @is_spmd_helper2()
-  call void @is_mixed_helper()
-  call void @__kmpc_target_deinit(%struct.ident_t* null, i1 true, i1 false)
-  ret void
-}
-
-define weak void @will_be_spmd() {
-; CHECK-LABEL: define {{[^@]+}}@will_be_spmd() {
-; CHECK-NEXT:    [[I:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* null, i1 true, i1 false, i1 false)
-; CHECK-NEXT:    call void @is_spmd_helper2()
-; CHECK-NEXT:    call void @__kmpc_target_deinit(%struct.ident_t* null, i1 true, i1 false)
-; CHECK-NEXT:    ret void
-;
-  %i = call i32 @__kmpc_target_init(%struct.ident_t* null, i1 false, i1 false, i1 false)
-  call void @is_spmd_helper2()
-  call void @__kmpc_target_deinit(%struct.ident_t* null, i1 false, i1 false)
-  ret void
-}
-
-define weak void @non_spmd() {
-; CHECK-LABEL: define {{[^@]+}}@non_spmd() {
-; CHECK-NEXT:    [[I:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* null, i1 false, i1 false, i1 false)
-; CHECK-NEXT:    call void @is_generic_helper1()
-; CHECK-NEXT:    call void @is_generic_helper2()
-; CHECK-NEXT:    call void @is_mixed_helper()
-; CHECK-NEXT:    call void @__kmpc_target_deinit(%struct.ident_t* null, i1 false, i1 false)
-; CHECK-NEXT:    ret void
-;
-  %i = call i32 @__kmpc_target_init(%struct.ident_t* null, i1 false, i1 false, i1 false)
-  call void @is_generic_helper1()
-  call void @is_generic_helper2()
-  call void @is_mixed_helper()
-  call void @__kmpc_target_deinit(%struct.ident_t* null, i1 false, i1 false)
-  ret void
-}
-
-define weak void @will_not_be_spmd() {
-; CHECK-LABEL: define {{[^@]+}}@will_not_be_spmd() {
-; CHECK-NEXT:    [[I:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* null, i1 false, i1 false, i1 false)
-; CHECK-NEXT:    call void @is_generic_helper1()
-; CHECK-NEXT:    call void @is_generic_helper2()
-; CHECK-NEXT:    call void @is_mixed_helper()
-; CHECK-NEXT:    call void @__kmpc_target_deinit(%struct.ident_t* null, i1 false, i1 false)
-; CHECK-NEXT:    ret void
-;
-  %i = call i32 @__kmpc_target_init(%struct.ident_t* null, i1 false, i1 false, i1 false)
-  call void @is_generic_helper1()
-  call void @is_generic_helper2()
-  call void @is_mixed_helper()
-  call void @__kmpc_target_deinit(%struct.ident_t* null, i1 false, i1 false)
-  ret void
-}
-
-define internal void @is_spmd_helper1() {
-; CHECK-LABEL: define {{[^@]+}}@is_spmd_helper1() {
-; CHECK-NEXT:    store i8 1, i8* @G, align 1
-; CHECK-NEXT:    ret void
-;
-  %isSPMD = call i8 @__kmpc_is_spmd_exec_mode()
-  store i8 %isSPMD, i8* @G
-  ret void
-}
-
-define internal void @is_spmd_helper2() {
-; CHECK-LABEL: define {{[^@]+}}@is_spmd_helper2() {
-; CHECK-NEXT:    br label [[F:%.*]]
-; CHECK:       t:
-; CHECK-NEXT:    unreachable
-; CHECK:       f:
-; CHECK-NEXT:    ret void
-;
-  %isSPMD = call i8 @__kmpc_is_spmd_exec_mode()
-  %c = icmp eq i8 %isSPMD, 0
-  br i1 %c, label %t, label %f
-t:
-  call void @spmd_compatible()
-  ret void
-f:
-  ret void
-}
-
-define internal void @is_generic_helper1() {
-; CHECK-LABEL: define {{[^@]+}}@is_generic_helper1() {
-; CHECK-NEXT:    store i8 0, i8* @G, align 1
-; CHECK-NEXT:    ret void
-;
-  %isSPMD = call i8 @__kmpc_is_spmd_exec_mode()
-  store i8 %isSPMD, i8* @G
-  ret void
-}
-
-define internal void @is_generic_helper2() {
-; CHECK-LABEL: define {{[^@]+}}@is_generic_helper2() {
-; CHECK-NEXT:    br label [[T:%.*]]
-; CHECK:       t:
-; CHECK-NEXT:    call void @foo()
-; CHECK-NEXT:    ret void
-; CHECK:       f:
-; CHECK-NEXT:    unreachable
-;
-  %isSPMD = call i8 @__kmpc_is_spmd_exec_mode()
-  %c = icmp eq i8 %isSPMD, 0
-  br i1 %c, label %t, label %f
-t:
-  call void @foo()
-  ret void
-f:
-  call void @bar()
-  ret void
-}
-
-define internal void @is_mixed_helper() {
-; CHECK-LABEL: define {{[^@]+}}@is_mixed_helper() {
-; CHECK-NEXT:    [[ISSPMD:%.*]] = call i8 @__kmpc_is_spmd_exec_mode()
-; CHECK-NEXT:    store i8 undef, i8* @G, align 1
-; CHECK-NEXT:    ret void
-;
-  %isSPMD = call i8 @__kmpc_is_spmd_exec_mode()
-  store i8 %isSPMD, i8* @G
-  ret void
-}
-
-declare void @spmd_compatible() "llvm.assume"="ompx_spmd_amenable"
-declare i8 @__kmpc_is_spmd_exec_mode()
-declare i32 @__kmpc_target_init(%struct.ident_t*, i1 zeroext, i1 zeroext, i1 zeroext) #1
-declare void @__kmpc_target_deinit(%struct.ident_t* nocapture readnone, i1 zeroext, i1 zeroext) #1
-declare void @foo()
-declare void @bar()
-
-!llvm.module.flags = !{!0, !1}
-!nvvm.annotations = !{!2, !3, !4, !5}
-
-!0 = !{i32 7, !"openmp", i32 50}
-!1 = !{i32 7, !"openmp-device", i32 50}
-!2 = !{void ()* @is_spmd, !"kernel", i32 1}
-!3 = !{void ()* @will_be_spmd, !"kernel", i32 1}
-!4 = !{void ()* @non_spmd, !"kernel", i32 1}
-!5 = !{void ()* @will_not_be_spmd, !"kernel", i32 1}
-;.
-; CHECK: attributes #[[ATTR0:[0-9]+]] = { "llvm.assume"="ompx_spmd_amenable" }
-;.
-; CHECK: [[META0:![0-9]+]] = !{i32 7, !"openmp", i32 50}
-; CHECK: [[META1:![0-9]+]] = !{i32 7, !"openmp-device", i32 50}
-; CHECK: [[META2:![0-9]+]] = !{void ()* @is_spmd, !"kernel", i32 1}
-; CHECK: [[META3:![0-9]+]] = !{void ()* @will_be_spmd, !"kernel", i32 1}
-; CHECK: [[META4:![0-9]+]] = !{void ()* @non_spmd, !"kernel", i32 1}
-; CHECK: [[META5:![0-9]+]] = !{void ()* @will_not_be_spmd, !"kernel", i32 1}
-;.


        


More information about the llvm-commits mailing list