forked from OSchip/llvm-project
[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 llvm-svn: 311922
This commit is contained in:
parent
0f76a35c5e
commit
20cb7e887f
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
}
|
Loading…
Reference in New Issue