Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion mlir/lib/IR/PatternMatch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,10 @@ void RewriterBase::eraseOp(Operation *op) {
// until the region is empty. (The block graph could be disconnected.)
while (!r.empty()) {
SmallVector<Block *> erasedBlocks;
for (Block *b : llvm::post_order(&r.front())) {
// Some blocks may have invalid successor, use a set including nullptr
// to avoid null pointer.
std::set<Block *> visited{nullptr};
for (Block *b : llvm::post_order_ext(&r.front(), visited)) {
// Visit ops in reverse order.
for (Operation &op :
llvm::make_early_inc_range(ReverseIterator::makeIterable(*b)))
Expand Down
21 changes: 21 additions & 0 deletions mlir/test/Transforms/gh-77420.mlir
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// RUN: mlir-opt --canonicalize %s | FileCheck %s


module {

// CHECK: func.func @f() {
// CHECK-NEXT: return
// CHECK-NEXT: }
func.func @f() {
return
^bb1: // no predecessors
omp.parallel {
%0 = llvm.intr.stacksave : !llvm.ptr
llvm.br ^bb1
^bb1: // pred: ^bb0
omp.terminator
}
return
}

}