Skip to content

Commit 13dfab5

Browse files
committed
[MLIR][CF] Abort collapseBranch for any cycle (#159743)
We can bail out of collapseBranch upon detecting any cycle, but we must update a test in flang to prevent a regression.
1 parent a4ae338 commit 13dfab5

File tree

3 files changed

+18
-10
lines changed

3 files changed

+18
-10
lines changed

flang/test/Lower/OpenMP/infinite-loop-in-construct.f90

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@
88
! CHECK: cf.cond_br %{{[0-9]+}}, ^bb1, ^bb2
99
! CHECK-NEXT: ^bb1: // pred: ^bb0
1010
! CHECK: cf.br ^bb2
11-
! CHECK-NEXT: ^bb2: // 3 preds: ^bb0, ^bb1, ^bb2
12-
! CHECK-NEXT: cf.br ^bb2
11+
! CHECK-NEXT: ^bb2: // 2 preds: ^bb0, ^bb1
12+
! CHECK: cf.br ^bb3
13+
! CHECK-NEXT: ^bb3: // 2 preds: ^bb2, ^bb3
14+
! CHECK: cf.br ^bb3
1315
! CHECK-NEXT: }
1416

1517
subroutine sb(ninter, numnod)

mlir/lib/Dialect/ControlFlow/IR/ControlFlowOps.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,13 +124,11 @@ static LogicalResult collapseBranch(Block *&successor,
124124
return failure();
125125
// Don't try to collapse branches which participate in a cycle.
126126
BranchOp nextBranch = dyn_cast<BranchOp>(successorDest->getTerminator());
127-
llvm::DenseSet<Block *> visited{successorDest};
127+
llvm::DenseSet<Block *> visited{successor, successorDest};
128128
while (nextBranch) {
129129
Block *nextBranchDest = nextBranch.getDest();
130-
if (nextBranchDest == successor)
130+
if (visited.contains(nextBranchDest))
131131
return failure();
132-
else if (visited.contains(nextBranchDest))
133-
break;
134132
visited.insert(nextBranchDest);
135133
nextBranch = dyn_cast<BranchOp>(nextBranchDest->getTerminator());
136134
}

mlir/test/Dialect/ControlFlow/canonicalize.mlir

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -587,9 +587,13 @@ func.func @cycle_1_block() {
587587

588588
// CHECK-LABEL: @unsimplified_cycle_1
589589
// CHECK-SAME: %[[ARG0:.*]]: i1) {
590-
// CHECK: cf.br ^bb1
590+
// CHECK: cf.cond_br %[[ARG0]], ^bb1, ^bb2
591591
// CHECK: ^bb1:
592-
// CHECK: cf.br ^bb1
592+
// CHECK: cf.br ^bb2
593+
// CHECK: ^bb2:
594+
// CHECK: cf.br ^bb3
595+
// CHECK: ^bb3:
596+
// CHECK: cf.br ^bb3
593597
func.func @unsimplified_cycle_1(%c : i1) {
594598
cf.cond_br %c, ^bb1, ^bb2
595599
^bb1:
@@ -606,9 +610,13 @@ func.func @unsimplified_cycle_1(%c : i1) {
606610

607611
// CHECK-LABEL: @unsimplified_cycle_2
608612
// CHECK-SAME: %[[ARG0:.*]]: i1) {
609-
// CHECK: cf.br ^bb1
613+
// CHECK: cf.cond_br %[[ARG0]], ^bb1, ^bb3
610614
// CHECK: ^bb1:
611-
// CHECK: cf.br ^bb1 {E}
615+
// CHECK: cf.br ^bb2 {A}
616+
// CHECK: ^bb2:
617+
// CHECK: cf.br ^bb2 {E}
618+
// CHECK: ^bb3:
619+
// CHECK: cf.br ^bb1
612620
func.func @unsimplified_cycle_2(%c : i1) {
613621
cf.cond_br %c, ^bb6, ^bb7
614622
^bb6:

0 commit comments

Comments
 (0)