diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Transforms/Utils/LoopUnrollPeel.cpp | 18 | ||||
| -rw-r--r-- | llvm/test/Transforms/LoopUnroll/peel-loop-scev-invalidate.ll | 42 | 
2 files changed, 50 insertions, 10 deletions
diff --git a/llvm/lib/Transforms/Utils/LoopUnrollPeel.cpp b/llvm/lib/Transforms/Utils/LoopUnrollPeel.cpp index f893921aca3..fca05b7b6f2 100644 --- a/llvm/lib/Transforms/Utils/LoopUnrollPeel.cpp +++ b/llvm/lib/Transforms/Utils/LoopUnrollPeel.cpp @@ -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++; diff --git a/llvm/test/Transforms/LoopUnroll/peel-loop-scev-invalidate.ll b/llvm/test/Transforms/LoopUnroll/peel-loop-scev-invalidate.ll new file mode 100644 index 00000000000..c44da31cebd --- /dev/null +++ b/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 +}  | 

