Index: lib/Transforms/Utils/LoopUnroll.cpp =================================================================== --- lib/Transforms/Utils/LoopUnroll.cpp +++ lib/Transforms/Utils/LoopUnroll.cpp @@ -335,6 +335,17 @@ return false; } + // If the loop is not rotated the latch is not one of the exiting blocks. + // Bail out on non-rotated loops. + SmallVector ExitingBlocks; + L->getExitingBlocks(ExitingBlocks); + bool NotRotated = + llvm::all_of(ExitingBlocks, [&LatchBlock](const BasicBlock *BB) { + return LatchBlock != BB; + }); + if (NotRotated) + return false; + if (TripCount != 0) DEBUG(dbgs() << " Trip Count = " << TripCount << "\n"); if (TripMultiple != 1) Index: test/Transforms/LoopUnroll/not-rotated.ll =================================================================== --- /dev/null +++ test/Transforms/LoopUnroll/not-rotated.ll @@ -0,0 +1,21 @@ +; RUN: opt -loop-unroll -verify-dom-info %s +; REQUIRE: asserts + +define void @tinkywinky() { +entry: + br label %header1 +header1: + %indvars.iv = phi i64 [ 1, %body2 ], [ 0, %entry ] + %exitcond = icmp ne i64 %indvars.iv, 1 + br i1 %exitcond, label %body1, label %exit +body1: + br i1 true, label %body2, label %sink +body2: + br i1 true, label %header1, label %body3 +body3: + br label %sink +sink: + br label %body2 +exit: + ret void +}