// 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");
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;
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 "
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
; 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() {