diff --git a/llvm/lib/Transforms/Scalar/DFAJumpThreading.cpp b/llvm/lib/Transforms/Scalar/DFAJumpThreading.cpp index 0219f65618d8d..85d4065286e41 100644 --- a/llvm/lib/Transforms/Scalar/DFAJumpThreading.cpp +++ b/llvm/lib/Transforms/Scalar/DFAJumpThreading.cpp @@ -910,8 +910,9 @@ struct TransformDFA { PathBBs.pop_front(); auto DetIt = llvm::find(PathBBs, Determinator); - auto Prev = std::prev(DetIt); - BasicBlock *PrevBB = *Prev; + // When there is only one BB in PathBBs, the determinator takes itself as a + // direct predecessor. + BasicBlock *PrevBB = PathBBs.size() == 1 ? *DetIt : *std::prev(DetIt); for (auto BBIt = DetIt; BBIt != PathBBs.end(); BBIt++) { BasicBlock *BB = *BBIt; BlocksToClean.insert(BB); diff --git a/llvm/test/Transforms/DFAJumpThreading/dfa-jump-threading-transform.ll b/llvm/test/Transforms/DFAJumpThreading/dfa-jump-threading-transform.ll index f40d4853d8a2f..7cc82386aa171 100644 --- a/llvm/test/Transforms/DFAJumpThreading/dfa-jump-threading-transform.ll +++ b/llvm/test/Transforms/DFAJumpThreading/dfa-jump-threading-transform.ll @@ -267,3 +267,38 @@ entry: end: ret void } + +define void @self-reference(i1 %c) { +; CHECK-LABEL: @self-reference( +; CHECK-NEXT: entry: +; CHECK-NEXT: br i1 [[C:%.*]], label [[DOTSPLIT_PREHEADER:%.*]], label [[DOTSPLIT_PREHEADER]] +; CHECK: .split.preheader: +; CHECK-NEXT: br label [[DOTSPLIT:%.*]] +; CHECK: .split: +; CHECK-NEXT: [[TMP0:%.*]] = phi i32 [ 0, [[DOTSPLIT_PREHEADER]] ] +; CHECK-NEXT: switch i32 [[TMP0]], label [[END:%.*]] [ +; CHECK-NEXT: i32 -1, label [[END]] +; CHECK-NEXT: i32 0, label [[DOTSPLIT_JT4294967295:%.*]] +; CHECK-NEXT: ] +; CHECK: .split.jt4294967295: +; CHECK-NEXT: [[TMP1:%.*]] = phi i32 [ -1, [[DOTSPLIT]] ] +; CHECK-NEXT: br label [[END]] +; CHECK: end: +; CHECK-NEXT: ret void +; +entry: + br i1 %c, label %.split.preheader, label %.split.preheader + +.split.preheader: + br label %.split + +.split: + %0 = phi i32 [ 0, %.split.preheader ], [ -1, %.split ] + switch i32 %0, label %end [ + i32 -1, label %end + i32 0, label %.split + ] + +end: + ret void +}