aboutsummaryrefslogtreecommitdiff
path: root/mlir/lib/Dialect/ControlFlow/IR/ControlFlowOps.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mlir/lib/Dialect/ControlFlow/IR/ControlFlowOps.cpp')
-rw-r--r--mlir/lib/Dialect/ControlFlow/IR/ControlFlowOps.cpp10
1 files changed, 10 insertions, 0 deletions
diff --git a/mlir/lib/Dialect/ControlFlow/IR/ControlFlowOps.cpp b/mlir/lib/Dialect/ControlFlow/IR/ControlFlowOps.cpp
index 582593a..f1da1a1 100644
--- a/mlir/lib/Dialect/ControlFlow/IR/ControlFlowOps.cpp
+++ b/mlir/lib/Dialect/ControlFlow/IR/ControlFlowOps.cpp
@@ -122,6 +122,16 @@ static LogicalResult collapseBranch(Block *&successor,
Block *successorDest = successorBranch.getDest();
if (successorDest == successor)
return failure();
+ // Don't try to collapse branches which participate in a cycle.
+ BranchOp nextBranch = dyn_cast<BranchOp>(successorDest->getTerminator());
+ llvm::DenseSet<Block *> visited{successor, successorDest};
+ while (nextBranch) {
+ Block *nextBranchDest = nextBranch.getDest();
+ if (visited.contains(nextBranchDest))
+ return failure();
+ visited.insert(nextBranchDest);
+ nextBranch = dyn_cast<BranchOp>(nextBranchDest->getTerminator());
+ }
// Update the operands to the successor. If the branch parent has no
// arguments, we can use the branch operands directly.