diff --git a/mlir/lib/IR/PatternMatch.cpp b/mlir/lib/IR/PatternMatch.cpp index 5ba5328f14b89..8796289d72570 100644 --- a/mlir/lib/IR/PatternMatch.cpp +++ b/mlir/lib/IR/PatternMatch.cpp @@ -229,7 +229,10 @@ void RewriterBase::eraseOp(Operation *op) { // until the region is empty. (The block graph could be disconnected.) while (!r.empty()) { SmallVector erasedBlocks; - for (Block *b : llvm::post_order(&r.front())) { + // Some blocks may have invalid successor, use a set including nullptr + // to avoid null pointer. + llvm::SmallPtrSet 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))) diff --git a/mlir/test/Transforms/gh-77420.mlir b/mlir/test/Transforms/gh-77420.mlir new file mode 100644 index 0000000000000..0037cec0a96ab --- /dev/null +++ b/mlir/test/Transforms/gh-77420.mlir @@ -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 + } + +}