1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 18:54:02 +01:00

Revert r346810 "Preserve loop metadata when splitting exit blocks"

It broke the Windows self-host:
http://lab.llvm.org:8011/builders/clang-x64-windows-msvc/builds/1457

llvm-svn: 346823
This commit is contained in:
Reid Kleckner 2018-11-14 01:47:32 +00:00
parent 45401535d6
commit 832c62c1ef
2 changed files with 0 additions and 80 deletions

View File

@ -74,41 +74,9 @@ bool llvm::formDedicatedExitBlocks(Loop *L, DominatorTree *DT, LoopInfo *LI,
if (IsDedicatedExit)
return false;
// With nested loops, the inner loop might exit to the header of an
// enclosing loop, and the in-loop-predecessor is a latch for that
// enclosing loop. If we insert a block between the latch and the header,
// that block becomes the new latch. Any loop metadata from the old latch
// needs to be moved to the new one.
MDNode *OuterLoopMD = nullptr;
// If the exit block is a header of a different loop, get that loop's
// metadata before we split the block.
if (LI->isLoopHeader(BB))
OuterLoopMD = LI->getLoopFor(BB)->getLoopID();
auto *NewExitBB = SplitBlockPredecessors(
BB, InLoopPredecessors, ".loopexit", DT, LI, nullptr, PreserveLCSSA);
// If OuterLoopMD is non-null, we know that the exit block BB is a
// loop header for a different loop, with metadata on its back edges.
// If NewExitBB is a member of that loop, then NewExitBB is a latch,
// and the loop's metadata needs to be copied to NewExitBB.
if (NewExitBB && OuterLoopMD &&
LI->getLoopFor(NewExitBB) == LI->getLoopFor(BB)) {
// The preds of NewExitBB are all former latches of the outer loop.
// Remove their metadata.
for (auto *PredLoopBB : InLoopPredecessors) {
Instruction *TI = PredLoopBB->getTerminator();
// All the latches should have the same metadata (ensured by
// getLoopID()).
assert(TI->getMetadata(LLVMContext::MD_loop) == OuterLoopMD &&
"exit edge to other loop doesn't contain expected metadata");
TI->setMetadata(LLVMContext::MD_loop, nullptr);
}
NewExitBB->getTerminator()->setMetadata(LLVMContext::MD_loop,
OuterLoopMD);
}
if (!NewExitBB)
LLVM_DEBUG(
dbgs() << "WARNING: Can't create a dedicated exit block for loop: "

View File

@ -1,48 +0,0 @@
; RUN: opt -S -loop-simplify < %s | FileCheck %s
; Two-loop nest with llvm.loop metadata on each loop.
; inner.header exits to outer.header. inner.header is a latch for the outer
; loop, and contains the outer loop's metadata.
; After loop-simplify, a new block "outer.header.loopexit" is created between
; inner.header and outer.header. The metadata from inner.header must be moved
; to the new block, as the new block becomes the outer loop latch.
; The metadata on the inner loop's latch should be untouched.
; CHECK: outer.header.loopexit:
; CHECK-NEXT: llvm.loop [[UJAMTAG:.*]]
; CHECK-NOT: br i1 {{.*}}, label {{.*}}, label %outer.header.loopexit, !llvm.loop
; CHECK: br label %inner.header, !llvm.loop [[UNROLLTAG:.*]]
; CHECK: distinct !{[[UJAMTAG]], [[UJAM:.*]]}
; CHECK: [[UJAM]] = !{!"llvm.loop.unroll_and_jam.count", i32 17}
; CHECK: distinct !{[[UNROLLTAG]], [[UNROLL:.*]]}
; CHECK: [[UNROLL]] = !{!"llvm.loop.unroll.count", i32 1}
define dso_local void @loopnest() local_unnamed_addr #0 {
entry:
br label %outer.header
outer.header: ; preds = %inner.header, %entry
%ii.0 = phi i64 [ 2, %entry ], [ %add, %inner.header ]
%cmp = icmp ult i64 %ii.0, 64
br i1 %cmp, label %inner.header, label %outer.header.cleanup
outer.header.cleanup: ; preds = %outer.header
ret void
inner.header: ; preds = %outer.header, %inner.body
%j.0 = phi i64 [ %add10, %inner.body ], [ %ii.0, %outer.header ]
%add = add nuw nsw i64 %ii.0, 16
%cmp2 = icmp ult i64 %j.0, %add
br i1 %cmp2, label %inner.body, label %outer.header, !llvm.loop !2
inner.body: ; preds = %inner.header
%add10 = add nuw nsw i64 %j.0, 1
br label %inner.header, !llvm.loop !4
}
!2 = distinct !{!2, !3}
!3 = !{!"llvm.loop.unroll_and_jam.count", i32 17}
!4 = distinct !{!4, !5}
!5 = !{!"llvm.loop.unroll.count", i32 1}