1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 18:54:02 +01:00
llvm-mirror/test/Transforms/LoopUnroll/unroll-loop-invalidation.ll
Arthur Eubanks b987f39d75 [NewPM] Hide pass manager debug logging behind -debug-pass-manager-verbose
Printing pass manager invocations is fairly verbose and not super
useful.

This allows us to remove DebugLogging from pass managers and PassBuilder
since all logging (aside from analysis managers) goes through
instrumentation now.

This has the downside of never being able to print the top level pass
manager via instrumentation, but that seems like a minor downside.

Reviewed By: ychen

Differential Revision: https://reviews.llvm.org/D101797
2021-05-07 21:51:47 -07:00

92 lines
3.2 KiB
LLVM

; This test exercises that we don't corrupt a loop-analysis when running loop
; unrolling in a way that deletes a loop. To do that, we first ensure the
; analysis is cached, then unroll the loop (deleting it) and make sure that the
; next function doesn't get a cache "hit" for this stale analysis result.
;
; RUN: opt -S -passes='loop(require<access-info>),loop-unroll,loop(print-access-info)' -debug-pass-manager < %s 2>&1 | FileCheck %s
;
; CHECK: Running analysis: LoopAnalysis
; CHECK: Running analysis: InnerAnalysisManagerProxy<
; CHECK: Running pass: RequireAnalysisPass<{{.*}}LoopAccessAnalysis
; CHECK: Running analysis: LoopAccessAnalysis on Loop at depth 2 containing: %inner1.header
; CHECK: Running pass: RequireAnalysisPass<{{.*}}LoopAccessAnalysis
; CHECK: Running analysis: LoopAccessAnalysis on Loop at depth 2 containing: %inner2.header
; CHECK: Running pass: RequireAnalysisPass<{{.*}}LoopAccessAnalysis
; CHECK: Running analysis: LoopAccessAnalysis on Loop at depth 1 containing: %outer.header
; CHECK: Running pass: LoopUnrollPass
; CHECK: Clearing all analysis results for: inner2.header
; CHECK: Clearing all analysis results for: outer.header
; CHECK: Invalidating analysis: LoopAccessAnalysis on {{.*}}inner1.header
; CHECK-NOT: Invalidating analysis: LoopAccessAnalysis on {{.*}}inner1.header.1
; CHECK: Running pass: LoopAccessInfoPrinterPass
; CHECK: Running analysis: LoopAccessAnalysis on Loop at depth 1 containing: %inner1.header
; CHECK: Loop access info in function 'test':
; CHECK: inner1.header:
; CHECK: Running pass: LoopAccessInfoPrinterPass
; CHECK: Running analysis: LoopAccessAnalysis on Loop at depth 1 containing: %inner1.header.1
; CHECK: Loop access info in function 'test':
; CHECK: inner1.header.1:
target triple = "x86_64-unknown-linux-gnu"
define void @test(i32 %inner1.count) {
; CHECK-LABEL: define void @test(
bb:
br label %outer.ph
outer.ph:
br label %outer.header
outer.header:
%outer.i = phi i32 [ 0, %outer.ph ], [ %outer.i.next, %outer.latch ]
br label %inner1.ph
inner1.ph:
br label %inner1.header
inner1.header:
%inner1.i = phi i32 [ 0, %inner1.ph ], [ %inner1.i.next, %inner1.header ]
%inner1.i.next = add i32 %inner1.i, 1
%inner1.cond = icmp eq i32 %inner1.i, %inner1.count
br i1 %inner1.cond, label %inner1.exit, label %inner1.header
; We should have two unrolled copies of this loop and nothing else.
;
; CHECK-NOT: icmp eq
; CHECK-NOT: br i1
; CHECK: %[[COND1:.*]] = icmp eq i32 %{{.*}}, %inner1.count
; CHECK: br i1 %[[COND1]],
; CHECK-NOT: icmp eq
; CHECK-NOT: br i1
; CHECK: %[[COND2:.*]] = icmp eq i32 %{{.*}}, %inner1.count
; CHECK: br i1 %[[COND2]],
; CHECK-NOT: icmp eq
; CHECK-NOT: br i1
inner1.exit:
br label %inner2.ph
inner2.ph:
br label %inner2.header
inner2.header:
%inner2.i = phi i32 [ 0, %inner2.ph ], [ %inner2.i.next, %inner2.header ]
%inner2.i.next = add i32 %inner2.i, 1
%inner2.cond = icmp eq i32 %inner2.i, 4
br i1 %inner2.cond, label %inner2.exit, label %inner2.header
inner2.exit:
br label %outer.latch
outer.latch:
%outer.i.next = add i32 %outer.i, 1
%outer.cond = icmp eq i32 %outer.i.next, 2
br i1 %outer.cond, label %outer.exit, label %outer.header
outer.exit:
br label %exit
exit:
ret void
}