[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