Skip to content

Commit 2c0fc0f

Browse files
authored
[DFAJumpThreading] Handle circular determinator (#78177)
Fixes the buildbot failure in #78134 (comment) When we meet the path with single `determinator`, the determinator actually takes itself as a predecessor. Thus, we need to let `Prev` be the determinator when `PathBBs` has only one element.
1 parent 89cdd48 commit 2c0fc0f

File tree

2 files changed

+38
-2
lines changed

2 files changed

+38
-2
lines changed

llvm/lib/Transforms/Scalar/DFAJumpThreading.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -910,8 +910,9 @@ struct TransformDFA {
910910
PathBBs.pop_front();
911911

912912
auto DetIt = llvm::find(PathBBs, Determinator);
913-
auto Prev = std::prev(DetIt);
914-
BasicBlock *PrevBB = *Prev;
913+
// When there is only one BB in PathBBs, the determinator takes itself as a
914+
// direct predecessor.
915+
BasicBlock *PrevBB = PathBBs.size() == 1 ? *DetIt : *std::prev(DetIt);
915916
for (auto BBIt = DetIt; BBIt != PathBBs.end(); BBIt++) {
916917
BasicBlock *BB = *BBIt;
917918
BlocksToClean.insert(BB);

llvm/test/Transforms/DFAJumpThreading/dfa-jump-threading-transform.ll

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,3 +267,38 @@ entry:
267267
end:
268268
ret void
269269
}
270+
271+
define void @self-reference(i1 %c) {
272+
; CHECK-LABEL: @self-reference(
273+
; CHECK-NEXT: entry:
274+
; CHECK-NEXT: br i1 [[C:%.*]], label [[DOTSPLIT_PREHEADER:%.*]], label [[DOTSPLIT_PREHEADER]]
275+
; CHECK: .split.preheader:
276+
; CHECK-NEXT: br label [[DOTSPLIT:%.*]]
277+
; CHECK: .split:
278+
; CHECK-NEXT: [[TMP0:%.*]] = phi i32 [ 0, [[DOTSPLIT_PREHEADER]] ]
279+
; CHECK-NEXT: switch i32 [[TMP0]], label [[END:%.*]] [
280+
; CHECK-NEXT: i32 -1, label [[END]]
281+
; CHECK-NEXT: i32 0, label [[DOTSPLIT_JT4294967295:%.*]]
282+
; CHECK-NEXT: ]
283+
; CHECK: .split.jt4294967295:
284+
; CHECK-NEXT: [[TMP1:%.*]] = phi i32 [ -1, [[DOTSPLIT]] ]
285+
; CHECK-NEXT: br label [[END]]
286+
; CHECK: end:
287+
; CHECK-NEXT: ret void
288+
;
289+
entry:
290+
br i1 %c, label %.split.preheader, label %.split.preheader
291+
292+
.split.preheader:
293+
br label %.split
294+
295+
.split:
296+
%0 = phi i32 [ 0, %.split.preheader ], [ -1, %.split ]
297+
switch i32 %0, label %end [
298+
i32 -1, label %end
299+
i32 0, label %.split
300+
]
301+
302+
end:
303+
ret void
304+
}

0 commit comments

Comments
 (0)