[llvm] 2dd158d - [OpenMP] Make barrier elimination work in the presence of llvm.assume

Johannes Doerfert via llvm-commits llvm-commits at lists.llvm.org
Wed Dec 7 22:39:22 PST 2022


Author: Johannes Doerfert
Date: 2022-12-07T22:37:57-08:00
New Revision: 2dd158d6553c252e6265f309f79274ecc9cae034

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

LOG: [OpenMP] Make barrier elimination work in the presence of llvm.assume

Assumptions are droppable and eliminating them to eliminate barriers
seems reasonable.

Added: 
    

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

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/IPO/OpenMPOpt.cpp b/llvm/lib/Transforms/IPO/OpenMPOpt.cpp
index f29ef1661dc6c..7d1da9276bac1 100644
--- a/llvm/lib/Transforms/IPO/OpenMPOpt.cpp
+++ b/llvm/lib/Transforms/IPO/OpenMPOpt.cpp
@@ -1484,8 +1484,9 @@ struct OpenMPOpt {
         // A barrier in a barrier pair is removeable if all instructions
         // between the barriers in the pair are side-effect free modulo the
         // barrier operation.
-        auto IsBarrierRemoveable = [&Kernel](BarrierInfo *StartBI,
-                                             BarrierInfo *EndBI) {
+        auto IsBarrierRemoveable = [&Kernel](
+                                       BarrierInfo *StartBI, BarrierInfo *EndBI,
+                                       SmallVector<AssumeInst *> &Assumptions) {
           assert(
               !StartBI->isImplicitExit() &&
               "Expected start barrier to be other than a kernel exit barrier");
@@ -1552,6 +1553,11 @@ struct OpenMPOpt {
               continue;
             }
 
+            if (auto *AI = dyn_cast<AssumeInst>(I)) {
+              Assumptions.push_back(AI);
+              continue;
+            }
+
             if (auto *LI = dyn_cast<LoadInst>(I))
               if (LI->hasMetadata(LLVMContext::MD_invariant_load))
                 continue;
@@ -1577,12 +1583,16 @@ struct OpenMPOpt {
           if (StartBI->isImplicit() && EndBI->isImplicit())
             continue;
 
-          if (!IsBarrierRemoveable(StartBI, EndBI))
+          SmallVector<AssumeInst *> Assumptions;
+          if (!IsBarrierRemoveable(StartBI, EndBI, Assumptions))
             continue;
 
           assert(!(StartBI->isImplicit() && EndBI->isImplicit()) &&
                  "Expected at least one explicit barrier to remove.");
 
+          for (auto *Assumption : Assumptions)
+            Assumption->eraseFromParent();
+
           // Remove an explicit barrier, check first, then second.
           if (!StartBI->isImplicit()) {
             LLVM_DEBUG(dbgs() << "Remove start barrier "

diff  --git a/llvm/test/Transforms/OpenMP/barrier_removal.ll b/llvm/test/Transforms/OpenMP/barrier_removal.ll
index ebf8f5499c203..4960966de9dc6 100644
--- a/llvm/test/Transforms/OpenMP/barrier_removal.ll
+++ b/llvm/test/Transforms/OpenMP/barrier_removal.ll
@@ -9,6 +9,7 @@ declare i32 @llvm.nvvm.barrier0.and(i32)
 declare i32 @llvm.nvvm.barrier0.or(i32)
 declare i32 @llvm.nvvm.barrier0.popc(i32)
 declare void @llvm.amdgcn.s.barrier()
+declare void @llvm.assume(i1)
 
 ;.
 ; CHECK: @[[GC1:[a-zA-Z0-9_$"\\.-]+]] = constant i32 42
@@ -27,7 +28,9 @@ define void @pos_empty_1() {
 ; CHECK-LABEL: define {{[^@]+}}@pos_empty_1() {
 ; CHECK-NEXT:    ret void
 ;
+  call void @llvm.assume(i1 true)
   call void @unknown() "llvm.assume"="ompx_aligned_barrier"
+  call void @llvm.assume(i1 true)
   ret void
 }
 define void @pos_empty_2() {


        


More information about the llvm-commits mailing list