From 0f62eea7ff4a1c5888eecba930d87361430a053b Mon Sep 17 00:00:00 2001 From: Davide Italiano Date: Mon, 24 Apr 2017 20:14:11 +0000 Subject: [LoopUnroll] Don't try to unroll non canonical loops. The current Loop Unroll implementation works with loops having a single latch that contains a conditional branch to a block outside the loop (the other successor is, by defition of latch, the header). If this precondition doesn't hold, avoid unrolling the loop as the code is not ready to handle such circumstances. Differential Revision: https://reviews.llvm.org/D32261 llvm-svn: 301239 --- llvm/test/Transforms/LoopUnroll/not-rotated.ll | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 llvm/test/Transforms/LoopUnroll/not-rotated.ll (limited to 'llvm/test/Transforms/LoopUnroll') diff --git a/llvm/test/Transforms/LoopUnroll/not-rotated.ll b/llvm/test/Transforms/LoopUnroll/not-rotated.ll new file mode 100644 index 00000000000..ffe80920d94 --- /dev/null +++ b/llvm/test/Transforms/LoopUnroll/not-rotated.ll @@ -0,0 +1,26 @@ +; PR28103 +; Bail out if the two successors are not the header +; and another bb outside of the loop. This case is not +; properly handled by LoopUnroll, currently. + +; RUN: opt -loop-unroll -verify-dom-info %s +; REQUIRE: asserts + +define void @tinkywinky(i1 %patatino) { +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 %patatino, label %body2, label %sink +body2: + br i1 %patatino, label %header1, label %body3 +body3: + br label %sink +sink: + br label %body2 +exit: + ret void +} -- cgit v1.2.3