Skip to content

Commit

Permalink
[LoopUnrollPeel] Add case where we should forget the peeled loop from…
Browse files Browse the repository at this point in the history
… SCEV.

The test case requires the peeled loop to be forgotten after peeling,
even though it does not have a parent. When called via the unroller,
SE->forgetTopmostLoop is also called, so the test case would also pass
without any SCEV invalidation, but peelLoop is exposed as utility
function. Also, in the test case, simplifyLoop will make changes,
removing the loop from SCEV, but it is better to not rely on this
behavior.

Reviewers: sanjoy, mkazantsev

Reviewed By: mkazantsev

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D58192

llvm-svn: 354031
  • Loading branch information
fhahn committed Feb 14, 2019
1 parent 2d874e5 commit 6ab83b7
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 10 deletions.
18 changes: 8 additions & 10 deletions llvm/lib/Transforms/Utils/LoopUnrollPeel.cpp
Expand Up @@ -664,16 +664,14 @@ bool llvm::peelLoop(Loop *L, unsigned PeelCount, LoopInfo *LI,
LatchBR->setMetadata(LLVMContext::MD_prof, WeightNode);
}

// If the loop is nested, we changed the parent loop, update SE.
if (Loop *ParentLoop = L->getParentLoop()) {
SE->forgetLoop(ParentLoop);

// FIXME: Incrementally update loop-simplify
simplifyLoop(ParentLoop, DT, LI, SE, AC, PreserveLCSSA);
} else {
// FIXME: Incrementally update loop-simplify
simplifyLoop(L, DT, LI, SE, AC, PreserveLCSSA);
}
if (Loop *ParentLoop = L->getParentLoop())
L = ParentLoop;

// We modified the loop, update SE.
SE->forgetTopmostLoop(L);

// FIXME: Incrementally update loop-simplify
simplifyLoop(L, DT, LI, SE, AC, PreserveLCSSA);

NumPeeled++;

Expand Down
42 changes: 42 additions & 0 deletions llvm/test/Transforms/LoopUnroll/peel-loop-scev-invalidate.ll
@@ -0,0 +1,42 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt < %s -S -loop-unroll -unroll-force-peel-count=1 -verify-scev -verify-dom-info | FileCheck %s


define void @test1(i32 %k) {
; CHECK-LABEL: @test1(
; CHECK-NEXT: entry:
; CHECK-NEXT: br label [[FOR_BODY_PEEL_BEGIN:%.*]]
; CHECK: for.body.peel.begin:
; CHECK-NEXT: br label [[FOR_BODY_PEEL:%.*]]
; CHECK: for.body.peel:
; CHECK-NEXT: [[INC_PEEL:%.*]] = add nsw i32 0, 1
; CHECK-NEXT: [[CMP_PEEL:%.*]] = icmp ult i32 0, [[K:%.*]]
; CHECK-NEXT: br i1 [[CMP_PEEL]], label [[FOR_BODY_PEEL_NEXT:%.*]], label [[FOR_END:%.*]]
; CHECK: for.body.peel.next:
; CHECK-NEXT: br label [[FOR_BODY_PEEL_NEXT1:%.*]]
; CHECK: for.body.peel.next1:
; CHECK-NEXT: br label [[ENTRY_PEEL_NEWPH:%.*]]
; CHECK: entry.peel.newph:
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
; CHECK: for.body:
; CHECK-NEXT: [[I_05:%.*]] = phi i32 [ [[INC_PEEL]], [[ENTRY_PEEL_NEWPH]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_05]], 1
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[I_05]], [[K]]
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END_LOOPEXIT:%.*]], !llvm.loop !0
; CHECK: for.end.loopexit:
; CHECK-NEXT: br label [[FOR_END]]
; CHECK: for.end:
; CHECK-NEXT: ret void
;
entry:
br label %for.body

for.body:
%i.05 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
%inc = add nsw i32 %i.05, 1
%cmp = icmp ult i32 %i.05, %k
br i1 %cmp, label %for.body, label %for.end

for.end:
ret void
}

0 comments on commit 6ab83b7

Please sign in to comment.