From: Davide Italiano Date: Mon, 28 Aug 2017 20:29:33 +0000 (+0000) Subject: [LoopUnroll] Properly update loop structure in case of successful peeling. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5e8dffb15684c9bae609660c40dc2d14354a8276;p=llvm [LoopUnroll] Properly update loop structure in case of successful peeling. When peeling kicks in, it updates the loop preheader. Later, a successful full unroll of the loop needs to update a PHI which i-th argument comes from the loop preheader, so it'd better look at the correct block. Fixes PR33437. Differential Revision: https://reviews.llvm.org/D37153 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@311922 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Utils/LoopUnroll.cpp b/lib/Transforms/Utils/LoopUnroll.cpp index 835f4399332..7759ac74d56 100644 --- a/lib/Transforms/Utils/LoopUnroll.cpp +++ b/lib/Transforms/Utils/LoopUnroll.cpp @@ -396,8 +396,19 @@ bool llvm::UnrollLoop(Loop *L, unsigned Count, unsigned TripCount, bool Force, "Did not expect runtime trip-count unrolling " "and peeling for the same loop"); - if (PeelCount) - peelLoop(L, PeelCount, LI, SE, DT, AC, PreserveLCSSA); + if (PeelCount) { + bool Peeled = peelLoop(L, PeelCount, LI, SE, DT, AC, PreserveLCSSA); + + // Successful peeling may result in a change in the loop preheader/trip + // counts. If we later unroll the loop, we want these to be updated. + if (Peeled) { + BasicBlock *ExitingBlock = L->getExitingBlock(); + assert(ExitingBlock && "Loop without exiting block?"); + Preheader = L->getLoopPreheader(); + TripCount = SE->getSmallConstantTripCount(L, ExitingBlock); + TripMultiple = SE->getSmallConstantTripMultiple(L, ExitingBlock); + } + } // Loops containing convergent instructions must have a count that divides // their TripMultiple. diff --git a/test/Transforms/LoopUnroll/pr33437.ll b/test/Transforms/LoopUnroll/pr33437.ll new file mode 100644 index 00000000000..58fa91f4b9a --- /dev/null +++ b/test/Transforms/LoopUnroll/pr33437.ll @@ -0,0 +1,30 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -loop-unroll %s -S | FileCheck %s + +declare zeroext i8 @patatino() + +define fastcc void @tinky() { +; CHECK-LABEL: @tinky( +; CHECK-NEXT: entry: +; CHECK-NEXT: br label [[FOR_COND93:%.*]] +; CHECK: for.cond93: +; CHECK-NEXT: br label [[FOR_BODY198:%.*]] +; CHECK: for.body198: +; CHECK-NEXT: [[CALL593:%.*]] = tail call zeroext i8 @patatino() +; CHECK-NEXT: ret void +; +entry: + br label %for.cond93 + +for.cond93.loopexit: + ret void + +for.cond93: + br label %for.body198 + +for.body198: + %l_249.12 = phi i8 [ undef, %for.cond93 ], [ %call593, %for.body198 ] + %l_522.01 = phi i32 [ 0, %for.cond93 ], [ 1, %for.body198 ] + %call593 = tail call zeroext i8 @patatino() + br i1 false, label %for.body198, label %for.cond93.loopexit +}