Index: llvm/lib/Analysis/MustExecute.cpp =================================================================== --- llvm/lib/Analysis/MustExecute.cpp +++ llvm/lib/Analysis/MustExecute.cpp @@ -201,6 +201,14 @@ SmallPtrSet Predecessors; collectTransitivePredecessors(CurLoop, BB, Predecessors); + // Bail out if the latch block is part of the predecessor set. In this case + // we may take the backedge to the header and not execute other latch + // successors. For loops in loop simplify form, this only happens if the + // latch is part of an irreducible cycle. + for (const BasicBlock *Pred : predecessors(CurLoop->getHeader())) + if (Predecessors.contains(Pred)) + return false; + // Make sure that all successors of, all predecessors of BB which are not // dominated by BB, are either: // 1) BB, Index: llvm/test/Transforms/LICM/pr57780.ll =================================================================== --- llvm/test/Transforms/LICM/pr57780.ll +++ llvm/test/Transforms/LICM/pr57780.ll @@ -7,7 +7,6 @@ define void @test() { ; CHECK-LABEL: @test( ; CHECK-NEXT: entry: -; CHECK-NEXT: store i16 5, ptr @c, align 2 ; CHECK-NEXT: br label [[LOOP:%.*]] ; CHECK: loop: ; CHECK-NEXT: [[V:%.*]] = phi i32 [ 10, [[ENTRY:%.*]] ], [ 0, [[LOOP_LATCH:%.*]] ] @@ -16,6 +15,7 @@ ; CHECK: loop.cont: ; CHECK-NEXT: br i1 false, label [[LOOP_IRREDUCIBLE:%.*]], label [[LOOP_LATCH]] ; CHECK: loop.irreducible: +; CHECK-NEXT: store i16 5, ptr @c, align 2 ; CHECK-NEXT: br label [[LOOP_LATCH]] ; CHECK: loop.latch: ; CHECK-NEXT: br i1 false, label [[LOOP_IRREDUCIBLE]], label [[LOOP]]