diff options
Diffstat (limited to 'test/Other')
-rw-r--r-- | test/Other/Inputs/glob-input | 0 | ||||
-rw-r--r-- | test/Other/cgscc-devirt-iteration.ll | 18 | ||||
-rw-r--r-- | test/Other/constant-fold-gep.ll | 2 | ||||
-rw-r--r-- | test/Other/debugcounter-newgvn.ll | 22 | ||||
-rw-r--r-- | test/Other/debugcounter-predicateinfo.ll | 39 | ||||
-rw-r--r-- | test/Other/invariant.group.barrier.ll | 62 | ||||
-rw-r--r-- | test/Other/lit-globbing.ll | 28 | ||||
-rw-r--r-- | test/Other/loop-pm-invalidation.ll | 277 | ||||
-rw-r--r-- | test/Other/new-pass-manager.ll | 95 | ||||
-rw-r--r-- | test/Other/new-pm-defaults.ll | 191 | ||||
-rw-r--r-- | test/Other/new-pm-lto-defaults.ll | 101 | ||||
-rw-r--r-- | test/Other/optimization-remarks-invalidation.ll | 80 | ||||
-rw-r--r-- | test/Other/optimization-remarks-lazy-bfi.ll | 88 | ||||
-rw-r--r-- | test/Other/writing-to-stdout.ll | 16 |
14 files changed, 925 insertions, 94 deletions
diff --git a/test/Other/Inputs/glob-input b/test/Other/Inputs/glob-input new file mode 100644 index 0000000000000..e69de29bb2d1d --- /dev/null +++ b/test/Other/Inputs/glob-input diff --git a/test/Other/cgscc-devirt-iteration.ll b/test/Other/cgscc-devirt-iteration.ll index df5ea2985b943..111dac5bccaf6 100644 --- a/test/Other/cgscc-devirt-iteration.ll +++ b/test/Other/cgscc-devirt-iteration.ll @@ -7,6 +7,9 @@ ; RUN: opt -aa-pipeline=basic-aa -passes='cgscc(function-attrs,function(gvn,instcombine))' -S < %s | FileCheck %s --check-prefix=CHECK --check-prefix=BEFORE ; RUN: opt -aa-pipeline=basic-aa -passes='cgscc(devirt<1>(function-attrs,function(gvn,instcombine)))' -S < %s | FileCheck %s --check-prefix=CHECK --check-prefix=AFTER --check-prefix=AFTER1 ; RUN: opt -aa-pipeline=basic-aa -passes='cgscc(devirt<2>(function-attrs,function(gvn,instcombine)))' -S < %s | FileCheck %s --check-prefix=CHECK --check-prefix=AFTER --check-prefix=AFTER2 +; +; We also verify that the real O2 pipeline catches these cases. +; RUN: opt -aa-pipeline=basic-aa -passes='default<O2>' -S < %s | FileCheck %s --check-prefix=CHECK --check-prefix=AFTER --check-prefix=AFTER2 declare void @readnone() readnone ; CHECK: Function Attrs: readnone @@ -93,8 +96,7 @@ entry: } declare i8* @memcpy(i8*, i8*, i64) -; CHECK-NOT: Function Attrs -; CHECK: declare i8* @memcpy(i8*, i8*, i64) +; CHECK: declare i8* @memcpy( ; The @test3 function checks that when we refine an indirect call to an ; intrinsic we still revisit the SCC pass. This also covers cases where the @@ -112,3 +114,15 @@ define void @test3(i8* %src, i8* %dest, i64 %size) { ; CHECK: call void @llvm.memcpy ret void } + +; A boring function that just keeps our declarations around. +define void @keep(i8** %sink) { +; CHECK-NOT: Function Attrs +; CHECK: define void @keep( +entry: + store volatile i8* bitcast (void ()* @readnone to i8*), i8** %sink + store volatile i8* bitcast (void ()* @unknown to i8*), i8** %sink + store volatile i8* bitcast (i8* (i8*, i8*, i64)* @memcpy to i8*), i8** %sink + call void @unknown() + ret void +} diff --git a/test/Other/constant-fold-gep.ll b/test/Other/constant-fold-gep.ll index 77c43a200c03f..8028b4fff9870 100644 --- a/test/Other/constant-fold-gep.ll +++ b/test/Other/constant-fold-gep.ll @@ -8,7 +8,7 @@ ; "TO" - Optimizations and targetdata. This tests target-dependent ; folding in the optimizers. -; RUN: opt -S -o - -instcombine -globalopt -default-data-layout="e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64" < %s | FileCheck --check-prefix=TO %s +; RUN: opt -S -o - -instcombine -globalopt -data-layout="e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64" < %s | FileCheck --check-prefix=TO %s ; "SCEV" - ScalarEvolution with default target layout ; RUN: opt -analyze -scalar-evolution < %s | FileCheck --check-prefix=SCEV %s diff --git a/test/Other/debugcounter-newgvn.ll b/test/Other/debugcounter-newgvn.ll new file mode 100644 index 0000000000000..cfe043c8455ac --- /dev/null +++ b/test/Other/debugcounter-newgvn.ll @@ -0,0 +1,22 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; REQUIRES: asserts +; RUN: opt -S -debug-counter=newgvn-vn-skip=1,newgvn-vn-count=2 -newgvn < %s 2>&1 | FileCheck %s +;; Test that, with debug counters on, we don't value number the first instruction, only the second and third, +;; which means we do not discover the return is constant. +define i32 @vntest() { +; CHECK-LABEL: @vntest( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[A:%.*]] = add i32 1, 3 +; CHECK-NEXT: [[D:%.*]] = add i32 8, 8 +; CHECK-NEXT: ret i32 [[D]] +; +bb: + %a = add i32 1, 3 + %b = add i32 %a, %a + %c = add i32 %a, %a + %d = add i32 %b, %c + ret i32 %d +} + + + diff --git a/test/Other/debugcounter-predicateinfo.ll b/test/Other/debugcounter-predicateinfo.ll new file mode 100644 index 0000000000000..eb2ec09802fed --- /dev/null +++ b/test/Other/debugcounter-predicateinfo.ll @@ -0,0 +1,39 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; REQUIRES: asserts +; RUN: opt -debug-counter=predicateinfo-rename-skip=1,predicateinfo-rename-count=1 -print-predicateinfo -analyze < %s 2>&1 | FileCheck %s +;; Test that, with debug counters on, we don't rename the first info, only the second +define fastcc void @barney() { +; CHECK-LABEL: @barney( +; CHECK-NEXT: bb: +; CHECK-NEXT: br label [[BB22:%.*]] +; CHECK: bb22: +; CHECK-NEXT: [[TMP23:%.*]] = icmp eq i32 undef, 2 +; CHECK: [[TMP23_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[TMP23]]) +; CHECK-NEXT: br i1 [[TMP23]], label [[BB29:%.*]], label [[BB35:%.*]] +; CHECK: bb29: +; CHECK: [[TMP23_0_1:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[TMP23_0]]) +; CHECK-NEXT: br i1 [[TMP23]], label [[BB33:%.*]], label [[BB35]] +; CHECK: bb33: +; CHECK-NEXT: br i1 [[TMP23_0_1]], label [[BB35]], label [[BB35]] +; CHECK: bb35: +; CHECK-NEXT: unreachable +; +bb: + br label %bb22 +bb22: ; preds = %bb21 + %tmp23 = icmp eq i32 undef, 2 + br i1 %tmp23, label %bb29, label %bb35 + + +bb29: ; preds = %bb28 +;; We will not rename this one (we will still generate a copy of a copy for the next one) + br i1 %tmp23, label %bb33, label %bb35 + + +bb33: ; preds = %bb31 +;; We will rename this one + br i1 %tmp23, label %bb35, label %bb35 + +bb35: ; preds = %bb33, %bb29, %bb22 + unreachable +} diff --git a/test/Other/invariant.group.barrier.ll b/test/Other/invariant.group.barrier.ll new file mode 100644 index 0000000000000..5b9b54f784f5a --- /dev/null +++ b/test/Other/invariant.group.barrier.ll @@ -0,0 +1,62 @@ +; RUN: opt -S -early-cse < %s | FileCheck %s +; RUN: opt -S -gvn < %s | FileCheck %s +; RUN: opt -S -newgvn < %s | FileCheck %s +; RUN: opt -S -O3 < %s | FileCheck %s + +; These tests checks if passes with CSE functionality can do CSE on +; invariant.group.barrier, that is prohibited if there is a memory clobber +; between barriers call. + +; CHECK-LABEL: define i8 @optimizable() +define i8 @optimizable() { +entry: + %ptr = alloca i8 + store i8 42, i8* %ptr, !invariant.group !0 +; CHECK: call i8* @llvm.invariant.group.barrier + %ptr2 = call i8* @llvm.invariant.group.barrier(i8* %ptr) +; CHECK-NOT: call i8* @llvm.invariant.group.barrier + %ptr3 = call i8* @llvm.invariant.group.barrier(i8* %ptr) +; CHECK: call void @clobber(i8* {{.*}}%ptr) + call void @clobber(i8* %ptr) + +; CHECK: call void @use(i8* {{.*}}%ptr2) + call void @use(i8* %ptr2) +; CHECK: call void @use(i8* {{.*}}%ptr2) + call void @use(i8* %ptr3) +; CHECK: load i8, i8* %ptr2, {{.*}}!invariant.group + %v = load i8, i8* %ptr3, !invariant.group !0 + + ret i8 %v +} + +; CHECK-LABEL: define i8 @unoptimizable() +define i8 @unoptimizable() { +entry: + %ptr = alloca i8 + store i8 42, i8* %ptr, !invariant.group !0 +; CHECK: call i8* @llvm.invariant.group.barrier + %ptr2 = call i8* @llvm.invariant.group.barrier(i8* %ptr) + call void @clobber(i8* %ptr) +; CHECK: call i8* @llvm.invariant.group.barrier + %ptr3 = call i8* @llvm.invariant.group.barrier(i8* %ptr) +; CHECK: call void @clobber(i8* {{.*}}%ptr) + call void @clobber(i8* %ptr) +; CHECK: call void @use(i8* {{.*}}%ptr2) + call void @use(i8* %ptr2) +; CHECK: call void @use(i8* {{.*}}%ptr3) + call void @use(i8* %ptr3) +; CHECK: load i8, i8* %ptr3, {{.*}}!invariant.group + %v = load i8, i8* %ptr3, !invariant.group !0 + + ret i8 %v +} + +declare void @use(i8* readonly) + +declare void @clobber(i8*) +; CHECK: Function Attrs: argmemonly nounwind readonly +; CHECK-NEXT: declare i8* @llvm.invariant.group.barrier(i8*) +declare i8* @llvm.invariant.group.barrier(i8*) + +!0 = !{} + diff --git a/test/Other/lit-globbing.ll b/test/Other/lit-globbing.ll new file mode 100644 index 0000000000000..5a668a90a40b3 --- /dev/null +++ b/test/Other/lit-globbing.ll @@ -0,0 +1,28 @@ +RUN: echo TA > %T/TA.txt
+RUN: echo TB > %T/TB.txt
+RUN: echo TAB > %T/TAB.txt
+
+RUN: echo %T/TA* | FileCheck -check-prefix=STAR %s
+RUN: echo %T/'TA'* | FileCheck -check-prefix=STAR %s
+RUN: echo %T/T'A'* | FileCheck -check-prefix=STAR %s
+
+RUN: echo %T/T?.txt | FileCheck -check-prefix=QUESTION %s
+RUN: echo %T/'T'?.txt | FileCheck -check-prefix=QUESTION %s
+
+RUN: echo %T/T??.txt | FileCheck -check-prefix=QUESTION2 %s
+RUN: echo %T/'T'??.txt | FileCheck -check-prefix=QUESTION2 %s
+
+RUN: echo 'T*' 'T?.txt' 'T??.txt' | FileCheck -check-prefix=QUOTEDARGS %s
+
+STAR-NOT: TB.txt
+STAR: {{(TA.txt.*TAB.txt|TAB.txt.*TA.txt)}}
+
+QUESTION-NOT: TAB.txt
+QUESTION: {{(TA.txt.*TB.txt|TB.txt.*TA.txt)}}
+
+QUESTION2-NOT: TA.txt
+QUESTION2-NOT: TB.txt
+QUESTION2: TAB.txt
+
+QUOTEDARGS-NOT: .txt
+QUOTEDARGS: T* T?.txt T??.txt
diff --git a/test/Other/loop-pm-invalidation.ll b/test/Other/loop-pm-invalidation.ll new file mode 100644 index 0000000000000..d2a0e23a7200b --- /dev/null +++ b/test/Other/loop-pm-invalidation.ll @@ -0,0 +1,277 @@ +; Test that the loop PM infrastructure is invalidated appropriately. +; +; Check that we always nuke the LPM stuff when the loops themselves are +; invalidated. +; RUN: opt -disable-output -disable-verify -debug-pass-manager %s 2>&1 \ +; RUN: -passes='loop(no-op-loop),invalidate<loops>,loop(no-op-loop)' \ +; RUN: | FileCheck %s --check-prefix=CHECK-LOOP-INV +; +; If we ended up building the standard analyses, their invalidation should nuke +; stuff as well. +; RUN: opt -disable-output -disable-verify -debug-pass-manager %s 2>&1 \ +; RUN: -passes='loop(no-op-loop),invalidate<scalar-evolution>,loop(no-op-loop)' \ +; RUN: | FileCheck %s --check-prefix=CHECK-SCEV-INV +; +; Also provide a test that can delete loops after populating analyses for them. +; RUN: opt -disable-output -disable-verify -debug-pass-manager %s 2>&1 \ +; RUN: -passes='loop(no-op-loop,loop-deletion),invalidate<scalar-evolution>,loop(no-op-loop)' \ +; RUN: | FileCheck %s --check-prefix=CHECK-SCEV-INV-AFTER-DELETE + +define void @no_loops() { +; CHECK-LOOP-INV-LABEL: Running pass: FunctionToLoopPassAdaptor<{{.*}}> on no_loops +; CHECK-LOOP-INV-NEXT: Running analysis: LoopAnalysis +; CHECK-LOOP-INV-NEXT: Running analysis: DominatorTreeAnalysis +; CHECK-LOOP-INV-NEXT: Running analysis: AssumptionAnalysis +; CHECK-LOOP-INV-NEXT: Running pass: InvalidateAnalysisPass<{{.*}}LoopAnalysis +; CHECK-LOOP-INV-NEXT: Invalidating all non-preserved analyses +; CHECK-LOOP-INV-NEXT: Invalidating analysis: LoopAnalysis +; CHECK-LOOP-INV-NEXT: Running pass: FunctionToLoopPassAdaptor<{{.*}}> on no_loops +; CHECK-LOOP-INV-NEXT: Running analysis: LoopAnalysis +; CHECK-LOOP-INV-NEXT: Finished {{.*}}Function pass manager run. +; +; CHECK-SCEV-INV-LABEL: Running pass: FunctionToLoopPassAdaptor<{{.*}}> on no_loops +; CHECK-SCEV-INV-NEXT: Running analysis: LoopAnalysis +; CHECK-SCEV-INV-NEXT: Running analysis: DominatorTreeAnalysis +; CHECK-SCEV-INV-NEXT: Running analysis: AssumptionAnalysis +; CHECK-SCEV-INV-NEXT: Running pass: InvalidateAnalysisPass<{{.*}}ScalarEvolutionAnalysis +; CHECK-SCEV-INV-NEXT: Invalidating all non-preserved analyses +; CHECK-SCEV-INV-NEXT: Running pass: FunctionToLoopPassAdaptor<{{.*}}> on no_loops +; CHECK-SCEV-INV-NEXT: Finished {{.*}}Function pass manager run. + +entry: + ret void +} + +define void @one_loop(i1* %ptr) { +; CHECK-LOOP-INV-LABEL: Running pass: FunctionToLoopPassAdaptor<{{.*}}> on one_loop +; CHECK-LOOP-INV-NEXT: Running analysis: LoopAnalysis +; CHECK-LOOP-INV-NEXT: Running analysis: DominatorTreeAnalysis +; CHECK-LOOP-INV-NEXT: Running analysis: AssumptionAnalysis +; CHECK-LOOP-INV-NEXT: Running analysis: AAManager +; CHECK-LOOP-INV-NEXT: Running analysis: TargetLibraryAnalysis +; CHECK-LOOP-INV-NEXT: Running analysis: ScalarEvolutionAnalysis +; CHECK-LOOP-INV-NEXT: Running analysis: TargetIRAnalysis +; CHECK-LOOP-INV-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}Loop +; CHECK-LOOP-INV-NEXT: Starting {{.*}}Loop pass manager run. +; CHECK-LOOP-INV-NEXT: Running pass: NoOpLoopPass +; CHECK-LOOP-INV-NEXT: Finished {{.*}}Loop pass manager run. +; CHECK-LOOP-INV-NEXT: Running pass: InvalidateAnalysisPass<{{.*}}LoopAnalysis +; CHECK-LOOP-INV-NEXT: Invalidating all non-preserved analyses +; CHECK-LOOP-INV-NEXT: Clearing all analysis results for: l0.header +; CHECK-LOOP-INV-NEXT: Invalidating analysis: LoopAnalysis +; CHECK-LOOP-INV-NEXT: Invalidating analysis: ScalarEvolutionAnalysis +; CHECK-LOOP-INV-NEXT: Invalidating analysis: InnerAnalysisManagerProxy<{{.*}}Loop +; CHECK-LOOP-INV-NEXT: Running pass: FunctionToLoopPassAdaptor<{{.*}}> on one_loop +; CHECK-LOOP-INV-NEXT: Running analysis: LoopAnalysis +; CHECK-LOOP-INV-NEXT: Running analysis: ScalarEvolutionAnalysis +; CHECK-LOOP-INV-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}Loop +; CHECK-LOOP-INV-NEXT: Starting {{.*}}Loop pass manager run. +; CHECK-LOOP-INV-NEXT: Running pass: NoOpLoopPass +; CHECK-LOOP-INV-NEXT: Finished {{.*}}Loop pass manager run. +; CHECK-LOOP-INV-NEXT: Finished {{.*}}Function pass manager run. +; +; CHECK-SCEV-INV-LABEL: Running pass: FunctionToLoopPassAdaptor<{{.*}}> on one_loop +; CHECK-SCEV-INV-NEXT: Running analysis: LoopAnalysis +; CHECK-SCEV-INV-NEXT: Running analysis: DominatorTreeAnalysis +; CHECK-SCEV-INV-NEXT: Running analysis: AssumptionAnalysis +; CHECK-SCEV-INV-NEXT: Running analysis: AAManager +; CHECK-SCEV-INV-NEXT: Running analysis: TargetLibraryAnalysis +; CHECK-SCEV-INV-NEXT: Running analysis: ScalarEvolutionAnalysis +; CHECK-SCEV-INV-NEXT: Running analysis: TargetIRAnalysis +; CHECK-SCEV-INV-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}Loop +; CHECK-SCEV-INV-NEXT: Starting {{.*}}Loop pass manager run. +; CHECK-SCEV-INV-NEXT: Running pass: NoOpLoopPass +; CHECK-SCEV-INV-NEXT: Finished {{.*}}Loop pass manager run. +; CHECK-SCEV-INV-NEXT: Running pass: InvalidateAnalysisPass<{{.*}}ScalarEvolutionAnalysis +; CHECK-SCEV-INV-NEXT: Invalidating all non-preserved analyses +; CHECK-SCEV-INV-NEXT: Clearing all analysis results for: l0.header +; CHECK-SCEV-INV-NEXT: Invalidating analysis: ScalarEvolutionAnalysis +; CHECK-SCEV-INV-NEXT: Invalidating analysis: InnerAnalysisManagerProxy<{{.*}}Loop +; CHECK-SCEV-INV-NEXT: Running pass: FunctionToLoopPassAdaptor<{{.*}}> on one_loop +; CHECK-SCEV-INV-NEXT: Running analysis: ScalarEvolutionAnalysis +; CHECK-SCEV-INV-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}Loop +; CHECK-SCEV-INV-NEXT: Starting {{.*}}Loop pass manager run. +; CHECK-SCEV-INV-NEXT: Running pass: NoOpLoopPass +; CHECK-SCEV-INV-NEXT: Finished {{.*}}Loop pass manager run. +; CHECK-SCEV-INV-NEXT: Finished {{.*}}Function pass manager run. + +entry: + br label %l0.header + +l0.header: + %flag0 = load volatile i1, i1* %ptr + br i1 %flag0, label %l0.header, label %exit + +exit: + ret void +} + +define void @nested_loops(i1* %ptr) { +; CHECK-LOOP-INV-LABEL: Running pass: FunctionToLoopPassAdaptor<{{.*}}> on nested_loops +; CHECK-LOOP-INV-NEXT: Running analysis: LoopAnalysis +; CHECK-LOOP-INV-NEXT: Running analysis: DominatorTreeAnalysis +; CHECK-LOOP-INV-NEXT: Running analysis: AssumptionAnalysis +; CHECK-LOOP-INV-NEXT: Running analysis: AAManager +; CHECK-LOOP-INV-NEXT: Running analysis: TargetLibraryAnalysis +; CHECK-LOOP-INV-NEXT: Running analysis: ScalarEvolutionAnalysis +; CHECK-LOOP-INV-NEXT: Running analysis: TargetIRAnalysis +; CHECK-LOOP-INV-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}Loop +; CHECK-LOOP-INV-NEXT: Starting {{.*}}Loop pass manager run. +; CHECK-LOOP-INV-NEXT: Running pass: NoOpLoopPass +; CHECK-LOOP-INV-NEXT: Finished {{.*}}Loop pass manager run. +; CHECK-LOOP-INV-NEXT: Starting {{.*}}Loop pass manager run. +; CHECK-LOOP-INV-NEXT: Running pass: NoOpLoopPass +; CHECK-LOOP-INV: Finished {{.*}}Loop pass manager run. +; CHECK-LOOP-INV-NEXT: Running pass: InvalidateAnalysisPass<{{.*}}LoopAnalysis +; CHECK-LOOP-INV-NEXT: Invalidating all non-preserved analyses +; CHECK-LOOP-INV-NEXT: Clearing all analysis results for: l.0.header +; CHECK-LOOP-INV-NEXT: Clearing all analysis results for: l.0.0.header +; CHECK-LOOP-INV-NEXT: Invalidating analysis: LoopAnalysis +; CHECK-LOOP-INV-NEXT: Invalidating analysis: ScalarEvolutionAnalysis +; CHECK-LOOP-INV-NEXT: Invalidating analysis: InnerAnalysisManagerProxy<{{.*}}Loop +; CHECK-LOOP-INV-NEXT: Running pass: FunctionToLoopPassAdaptor<{{.*}}> on nested_loops +; CHECK-LOOP-INV-NEXT: Running analysis: LoopAnalysis +; CHECK-LOOP-INV-NEXT: Running analysis: ScalarEvolutionAnalysis +; CHECK-LOOP-INV-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}Loop +; CHECK-LOOP-INV-NEXT: Starting {{.*}}Loop pass manager run. +; CHECK-LOOP-INV-NEXT: Running pass: NoOpLoopPass +; CHECK-LOOP-INV-NEXT: Finished {{.*}}Loop pass manager run. +; CHECK-LOOP-INV-NEXT: Starting {{.*}}Loop pass manager run. +; CHECK-LOOP-INV-NEXT: Running pass: NoOpLoopPass +; CHECK-LOOP-INV: Finished {{.*}}Loop pass manager run. +; CHECK-LOOP-INV-NEXT: Finished {{.*}}Function pass manager run. +; +; CHECK-SCEV-INV-LABEL: Running pass: FunctionToLoopPassAdaptor<{{.*}}> on nested_loops +; CHECK-SCEV-INV-NEXT: Running analysis: LoopAnalysis +; CHECK-SCEV-INV-NEXT: Running analysis: DominatorTreeAnalysis +; CHECK-SCEV-INV-NEXT: Running analysis: AssumptionAnalysis +; CHECK-SCEV-INV-NEXT: Running analysis: AAManager +; CHECK-SCEV-INV-NEXT: Running analysis: TargetLibraryAnalysis +; CHECK-SCEV-INV-NEXT: Running analysis: ScalarEvolutionAnalysis +; CHECK-SCEV-INV-NEXT: Running analysis: TargetIRAnalysis +; CHECK-SCEV-INV-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}Loop +; CHECK-SCEV-INV-NEXT: Starting {{.*}}Loop pass manager run. +; CHECK-SCEV-INV-NEXT: Running pass: NoOpLoopPass +; CHECK-SCEV-INV-NEXT: Finished {{.*}}Loop pass manager run. +; CHECK-SCEV-INV-NEXT: Starting {{.*}}Loop pass manager run. +; CHECK-SCEV-INV-NEXT: Running pass: NoOpLoopPass +; CHECK-SCEV-INV: Finished {{.*}}Loop pass manager run. +; CHECK-SCEV-INV-NEXT: Running pass: InvalidateAnalysisPass<{{.*}}ScalarEvolutionAnalysis +; CHECK-SCEV-INV-NEXT: Invalidating all non-preserved analyses +; CHECK-SCEV-INV-NEXT: Clearing all analysis results for: l.0.header +; CHECK-SCEV-INV-NEXT: Clearing all analysis results for: l.0.0.header +; CHECK-SCEV-INV-NEXT: Invalidating analysis: ScalarEvolutionAnalysis +; CHECK-SCEV-INV-NEXT: Invalidating analysis: InnerAnalysisManagerProxy<{{.*}}Loop +; CHECK-SCEV-INV-NEXT: Running pass: FunctionToLoopPassAdaptor<{{.*}}> on nested_loops +; CHECK-SCEV-INV-NEXT: Running analysis: ScalarEvolutionAnalysis +; CHECK-SCEV-INV-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}Loop +; CHECK-SCEV-INV-NEXT: Starting {{.*}}Loop pass manager run. +; CHECK-SCEV-INV-NEXT: Running pass: NoOpLoopPass +; CHECK-SCEV-INV-NEXT: Finished {{.*}}Loop pass manager run. +; CHECK-SCEV-INV-NEXT: Starting {{.*}}Loop pass manager run. +; CHECK-SCEV-INV-NEXT: Running pass: NoOpLoopPass +; CHECK-SCEV-INV: Finished {{.*}}Loop pass manager run. +; CHECK-SCEV-INV-NEXT: Finished {{.*}}Function pass manager run. + +entry: + br label %l.0.header + +l.0.header: + br label %l.0.0.header + +l.0.0.header: + %flag.0.0 = load volatile i1, i1* %ptr + br i1 %flag.0.0, label %l.0.0.header, label %l.0.latch + +l.0.latch: + %flag.0 = load volatile i1, i1* %ptr + br i1 %flag.0, label %l.0.header, label %exit + +exit: + ret void +} + +define void @dead_loop() { +; CHECK-LOOP-INV-LABEL: Running pass: FunctionToLoopPassAdaptor<{{.*}}> on dead_loop +; CHECK-LOOP-INV-NEXT: Running analysis: LoopAnalysis +; CHECK-LOOP-INV-NEXT: Running analysis: DominatorTreeAnalysis +; CHECK-LOOP-INV-NEXT: Running analysis: AssumptionAnalysis +; CHECK-LOOP-INV-NEXT: Running analysis: AAManager +; CHECK-LOOP-INV-NEXT: Running analysis: TargetLibraryAnalysis +; CHECK-LOOP-INV-NEXT: Running analysis: ScalarEvolutionAnalysis +; CHECK-LOOP-INV-NEXT: Running analysis: TargetIRAnalysis +; CHECK-LOOP-INV-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}Loop +; CHECK-LOOP-INV-NEXT: Starting {{.*}}Loop pass manager run. +; CHECK-LOOP-INV-NEXT: Running pass: NoOpLoopPass +; CHECK-LOOP-INV-NEXT: Finished {{.*}}Loop pass manager run. +; CHECK-LOOP-INV-NEXT: Running pass: InvalidateAnalysisPass<{{.*}}LoopAnalysis +; CHECK-LOOP-INV-NEXT: Invalidating all non-preserved analyses +; CHECK-LOOP-INV-NEXT: Clearing all analysis results for: l0.header +; CHECK-LOOP-INV-NEXT: Invalidating analysis: LoopAnalysis +; CHECK-LOOP-INV-NEXT: Invalidating analysis: ScalarEvolutionAnalysis +; CHECK-LOOP-INV-NEXT: Invalidating analysis: InnerAnalysisManagerProxy<{{.*}}Loop +; CHECK-LOOP-INV-NEXT: Running pass: FunctionToLoopPassAdaptor<{{.*}}> on dead_loop +; CHECK-LOOP-INV-NEXT: Running analysis: LoopAnalysis +; CHECK-LOOP-INV-NEXT: Running analysis: ScalarEvolutionAnalysis +; CHECK-LOOP-INV-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}Loop +; CHECK-LOOP-INV-NEXT: Starting {{.*}}Loop pass manager run. +; CHECK-LOOP-INV-NEXT: Running pass: NoOpLoopPass +; CHECK-LOOP-INV-NEXT: Finished {{.*}}Loop pass manager run. +; CHECK-LOOP-INV-NEXT: Finished {{.*}}Function pass manager run. +; +; CHECK-SCEV-INV-LABEL: Running pass: FunctionToLoopPassAdaptor<{{.*}}> on dead_loop +; CHECK-SCEV-INV-NEXT: Running analysis: LoopAnalysis +; CHECK-SCEV-INV-NEXT: Running analysis: DominatorTreeAnalysis +; CHECK-SCEV-INV-NEXT: Running analysis: AssumptionAnalysis +; CHECK-SCEV-INV-NEXT: Running analysis: AAManager +; CHECK-SCEV-INV-NEXT: Running analysis: TargetLibraryAnalysis +; CHECK-SCEV-INV-NEXT: Running analysis: ScalarEvolutionAnalysis +; CHECK-SCEV-INV-NEXT: Running analysis: TargetIRAnalysis +; CHECK-SCEV-INV-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}Loop +; CHECK-SCEV-INV-NEXT: Starting {{.*}}Loop pass manager run. +; CHECK-SCEV-INV-NEXT: Running pass: NoOpLoopPass +; CHECK-SCEV-INV-NEXT: Finished {{.*}}Loop pass manager run. +; CHECK-SCEV-INV-NEXT: Running pass: InvalidateAnalysisPass<{{.*}}ScalarEvolutionAnalysis +; CHECK-SCEV-INV-NEXT: Invalidating all non-preserved analyses +; CHECK-SCEV-INV-NEXT: Clearing all analysis results for: l0.header +; CHECK-SCEV-INV-NEXT: Invalidating analysis: ScalarEvolutionAnalysis +; CHECK-SCEV-INV-NEXT: Invalidating analysis: InnerAnalysisManagerProxy<{{.*}}Loop +; CHECK-SCEV-INV-NEXT: Running pass: FunctionToLoopPassAdaptor<{{.*}}> on dead_loop +; CHECK-SCEV-INV-NEXT: Running analysis: ScalarEvolutionAnalysis +; CHECK-SCEV-INV-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}Loop +; CHECK-SCEV-INV-NEXT: Starting {{.*}}Loop pass manager run. +; CHECK-SCEV-INV-NEXT: Running pass: NoOpLoopPass +; CHECK-SCEV-INV-NEXT: Finished {{.*}}Loop pass manager run. +; CHECK-SCEV-INV-NEXT: Finished {{.*}}Function pass manager run. +; +; CHECK-SCEV-INV-AFTER-DELETE-LABEL: Running pass: FunctionToLoopPassAdaptor<{{.*}}> on dead_loop +; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Running analysis: LoopAnalysis +; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Running analysis: DominatorTreeAnalysis +; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Running analysis: AssumptionAnalysis +; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Running analysis: AAManager +; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Running analysis: TargetLibraryAnalysis +; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Running analysis: ScalarEvolutionAnalysis +; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Running analysis: TargetIRAnalysis +; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}Loop +; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Starting {{.*}}Loop pass manager run. +; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Running pass: NoOpLoopPass +; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Running pass: LoopDeletionPass +; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Clearing all analysis results for: +; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Finished {{.*}}Loop pass manager run. +; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Invalidating all non-preserved analyses +; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Running pass: InvalidateAnalysisPass<{{.*}}ScalarEvolutionAnalysis +; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Invalidating all non-preserved analyses +; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Invalidating analysis: ScalarEvolutionAnalysis +; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Invalidating analysis: InnerAnalysisManagerProxy<{{.*}}Loop +; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Running pass: FunctionToLoopPassAdaptor<{{.*}}> on dead_loop +; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Finished {{.*}}Function pass manager run. + +entry: + br label %l0.header + +l0.header: + br i1 false, label %l0.header, label %exit + +exit: + ret void +} diff --git a/test/Other/new-pass-manager.ll b/test/Other/new-pass-manager.ll index eae2d855e92f0..bf8e596d118b8 100644 --- a/test/Other/new-pass-manager.ll +++ b/test/Other/new-pass-manager.ll @@ -384,95 +384,6 @@ ; CHECK-O0-NEXT: Finished llvm::Module pass manager run ; RUN: opt -disable-output -disable-verify -debug-pass-manager \ -; RUN: -passes='default<O1>' %s 2>&1 \ -; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O1 -; RUN: opt -disable-output -disable-verify -debug-pass-manager \ -; RUN: -passes='default<O2>' %s 2>&1 \ -; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O2 -; RUN: opt -disable-output -disable-verify -debug-pass-manager \ -; RUN: -passes='default<Os>' %s 2>&1 \ -; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-Os -; RUN: opt -disable-output -disable-verify -debug-pass-manager \ -; RUN: -passes='default<Oz>' %s 2>&1 \ -; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-Oz -; RUN: opt -disable-output -disable-verify -debug-pass-manager \ -; RUN: -passes='lto-pre-link<O2>' %s 2>&1 \ -; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O2 -; CHECK-O: Starting llvm::Module pass manager run -; CHECK-O: Starting llvm::Module pass manager run -; CHECK-O: Running pass: ForceFunctionAttrsPass -; CHECK-O: Running pass: InferFunctionAttrsPass -; CHECK-O: Starting llvm::Function pass manager run. -; CHECK-O: Running pass: SimplifyCFGPass -; CHECK-O: Running pass: SROA -; CHECK-O: Running pass: EarlyCSEPass -; CHECK-O: Running pass: LowerExpectIntrinsicPass -; CHECK-O: Running pass: GVNHoistPass -; CHECK-O: Finished llvm::Function pass manager run. -; CHECK-O: Running pass: IPSCCPPass -; CHECK-O: Running pass: GlobalOptPass -; CHECK-O: Running pass: ModuleToFunctionPassAdaptor<{{.*}}PromotePass> -; CHECK-O: Running pass: DeadArgumentEliminationPass -; CHECK-O: Starting llvm::Function pass manager run. -; CHECK-O: Running pass: InstCombinePass -; CHECK-O: Running pass: SimplifyCFGPass -; CHECK-O: Finished llvm::Function pass manager run. -; CHECK-O: Starting CGSCC pass manager run. -; CHECK-O: Starting llvm::Function pass manager run. -; CHECK-O: Running pass: SROA -; CHECK-O: Running pass: EarlyCSEPass -; CHECK-O: Running pass: SpeculativeExecutionPass -; CHECK-O: Running pass: JumpThreadingPass -; CHECK-O: Running pass: CorrelatedValuePropagationPass -; CHECK-O: Running pass: SimplifyCFGPass -; CHECK-O: Running pass: InstCombinePass -; CHECK-O1: Running pass: LibCallsShrinkWrapPass -; CHECK-O2: Running pass: LibCallsShrinkWrapPass -; CHECK-Os-NOT: Running pass: LibCallsShrinkWrapPass -; CHECK-Oz-NOT: Running pass: LibCallsShrinkWrapPass -; CHECK-O: Running pass: TailCallElimPass -; CHECK-O: Running pass: SimplifyCFGPass -; CHECK-O: Running pass: ReassociatePass -; CHECK-O: Starting Loop pass manager run. -; CHECK-O: Finished Loop pass manager run. -; CHECK-O: Running pass: SimplifyCFGPass -; CHECK-O: Running pass: InstCombinePass -; CHECK-O: Starting Loop pass manager run. -; CHECK-O: Finished Loop pass manager run. -; CHECK-O: Running pass: MemCpyOptPass -; CHECK-O: Running pass: SCCPPass -; CHECK-O: Running pass: BDCEPass -; CHECK-O: Running pass: InstCombinePass -; CHECK-O: Running pass: JumpThreadingPass -; CHECK-O: Running pass: CorrelatedValuePropagationPass -; CHECK-O: Running pass: DSEPass -; CHECK-O: Running pass: ADCEPass -; CHECK-O: Running pass: SimplifyCFGPass -; CHECK-O: Running pass: InstCombinePass -; CHECK-O: Finished llvm::Function pass manager run. -; CHECK-O: Finished CGSCC pass manager run. -; CHECK-O: Running pass: EliminateAvailableExternallyPass -; CHECK-O: Running pass: ReversePostOrderFunctionAttrsPass -; CHECK-O: Starting llvm::Function pass manager run. -; CHECK-O: Running pass: Float2IntPass -; CHECK-O: Running pass: LoopDistributePass -; CHECK-O: Running pass: InstCombinePass -; CHECK-O: Running pass: SLPVectorizerPass -; CHECK-O: Running pass: SimplifyCFGPass -; CHECK-O: Running pass: InstCombinePass -; CHECK-O: Running pass: AlignmentFromAssumptionsPass -; CHECK-O: Finished llvm::Function pass manager run. -; CHECK-O: Running pass: GlobalDCEPass -; CHECK-O: Running pass: ConstantMergePass - -; RUN: opt -disable-output -disable-verify -debug-pass-manager \ -; RUN: -passes='lto<O2>' %s 2>&1 \ -; RUN: | FileCheck %s --check-prefix=CHECK-LTO-O2 -; CHECK-LTO-O2: Starting llvm::Module pass manager run -; CHECK-LTO-O2: Running pass: InstCombinePass -; CHECK-LTO-O2: Running pass: SimplifyCFGPass - -; RUN: opt -disable-output -disable-verify -debug-pass-manager \ ; RUN: -passes='repeat<3>(no-op-module)' %s 2>&1 \ ; RUN: | FileCheck %s --check-prefix=CHECK-REPEAT-MODULE-PASS ; CHECK-REPEAT-MODULE-PASS: Starting llvm::Module pass manager run @@ -539,14 +450,15 @@ ; CHECK-REPEAT-LOOP-PASS-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}> ; CHECK-REPEAT-LOOP-PASS-NEXT: Starting llvm::Function pass manager run ; CHECK-REPEAT-LOOP-PASS-NEXT: Running pass: FunctionToLoopPassAdaptor -; CHECK-REPEAT-LOOP-PASS-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}> ; CHECK-REPEAT-LOOP-PASS-NEXT: Running analysis: LoopAnalysis ; CHECK-REPEAT-LOOP-PASS-NEXT: Running analysis: DominatorTreeAnalysis +; CHECK-REPEAT-LOOP-PASS-NEXT: Running analysis: AssumptionAnalysis +; CHECK-REPEAT-LOOP-PASS-NEXT: Invalidating all non-preserved analyses ; CHECK-REPEAT-LOOP-PASS-NEXT: Running analysis: AAManager ; CHECK-REPEAT-LOOP-PASS-NEXT: Running analysis: TargetLibraryAnalysis -; CHECK-REPEAT-LOOP-PASS-NEXT: Running analysis: AssumptionAnalysis ; CHECK-REPEAT-LOOP-PASS-NEXT: Running analysis: ScalarEvolutionAnalysis ; CHECK-REPEAT-LOOP-PASS-NEXT: Running analysis: TargetIRAnalysis +; CHECK-REPEAT-LOOP-PASS-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}> ; CHECK-REPEAT-LOOP-PASS-NEXT: Starting Loop pass manager run ; CHECK-REPEAT-LOOP-PASS-NEXT: Running pass: RepeatedPass ; CHECK-REPEAT-LOOP-PASS-NEXT: Starting Loop pass manager run @@ -560,6 +472,7 @@ ; CHECK-REPEAT-LOOP-PASS-NEXT: Finished Loop pass manager run ; CHECK-REPEAT-LOOP-PASS-NEXT: Finished Loop pass manager run ; CHECK-REPEAT-LOOP-PASS-NEXT: Finished llvm::Function pass manager run +; CHECK-REPEAT-LOOP-PASS-NEXT: Invalidating all non-preserved analyses ; CHECK-REPEAT-LOOP-PASS-NEXT: Finished llvm::Module pass manager run define void @foo(i1 %x, i8* %p1, i8* %p2) { diff --git a/test/Other/new-pm-defaults.ll b/test/Other/new-pm-defaults.ll new file mode 100644 index 0000000000000..7657f184b28cd --- /dev/null +++ b/test/Other/new-pm-defaults.ll @@ -0,0 +1,191 @@ +; The IR below was crafted so as: +; 1) To have a loop, so we create a loop pass manager +; 2) To be "immutable" in the sense that no pass in the standard +; pipeline will modify it. +; Since no transformations take place, we don't expect any analyses +; to be invalidated. +; Any invalidation that shows up here is a bug, unless we started modifying +; the IR, in which case we need to make it immutable harder. + +; RUN: opt -disable-verify -debug-pass-manager \ +; RUN: -passes='default<O1>' -S %s 2>&1 \ +; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O1 +; RUN: opt -disable-verify -debug-pass-manager \ +; RUN: -passes='default<O2>' -S %s 2>&1 \ +; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O2 +; RUN: opt -disable-verify -debug-pass-manager \ +; RUN: -passes='default<O3>' -S %s 2>&1 \ +; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O3 +; RUN: opt -disable-verify -debug-pass-manager \ +; RUN: -passes='default<Os>' -S %s 2>&1 \ +; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-Os +; RUN: opt -disable-verify -debug-pass-manager \ +; RUN: -passes='default<Oz>' -S %s 2>&1 \ +; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-Oz +; RUN: opt -disable-verify -debug-pass-manager \ +; RUN: -passes='lto-pre-link<O2>' -S %s 2>&1 \ +; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O2 + +; CHECK-O: Starting llvm::Module pass manager run. +; CHECK-O-NEXT: Running pass: PassManager<{{.*}}Module{{.*}}> +; CHECK-O-NEXT: Starting llvm::Module pass manager run. +; CHECK-O-NEXT: Running pass: ForceFunctionAttrsPass +; CHECK-O-NEXT: Running pass: InferFunctionAttrsPass +; CHECK-O-NEXT: Running analysis: TargetLibraryAnalysis +; CHECK-O-NEXT: Running pass: ModuleToFunctionPassAdaptor<{{.*}}PassManager{{.*}}> +; CHECK-O-NEXT: Running analysis: InnerAnalysisManagerProxy +; CHECK-O-NEXT: Starting llvm::Function pass manager run. +; CHECK-O-NEXT: Running pass: SimplifyCFGPass +; CHECK-O-NEXT: Running analysis: TargetIRAnalysis +; CHECK-O-NEXT: Running analysis: AssumptionAnalysis +; CHECK-O-NEXT: Running pass: SROA +; CHECK-O-NEXT: Running analysis: DominatorTreeAnalysis +; CHECK-O-NEXT: Running pass: EarlyCSEPass +; CHECK-O-NEXT: Running analysis: TargetLibraryAnalysis +; CHECK-O-NEXT: Running pass: LowerExpectIntrinsicPass +; CHECK-O-NEXT: Running pass: GVNHoistPass +; CHECK-O-NEXT: Running analysis: AAManager +; CHECK-O-NEXT: Running analysis: MemoryDependenceAnalysis +; CHECK-O-NEXT: Running analysis: MemorySSAAnalysis +; CHECK-O-NEXT: Finished llvm::Function pass manager run. +; CHECK-O-NEXT: Running pass: IPSCCPPass +; CHECK-O-NEXT: Running pass: GlobalOptPass +; CHECK-O-NEXT: Running pass: ModuleToFunctionPassAdaptor<{{.*}}PromotePass> +; CHECK-O-NEXT: Running pass: DeadArgumentEliminationPass +; CHECK-O-NEXT: Running pass: ModuleToFunctionPassAdaptor<{{.*}}PassManager{{.*}}> +; CHECK-O-NEXT: Starting llvm::Function pass manager run. +; CHECK-O-NEXT: Running pass: InstCombinePass +; CHECK-O-NEXT: Running pass: SimplifyCFGPass +; CHECK-O-NEXT: Finished llvm::Function pass manager run. +; CHECK-O-NEXT: Running pass: PGOIndirectCallPromotion +; CHECK-O-NEXT: Running pass: RequireAnalysisPass<{{.*}}GlobalsAA +; CHECK-O-NEXT: Running analysis: GlobalsAA +; CHECK-O-NEXT: Running analysis: CallGraphAnalysis +; CHECK-O-NEXT: Running pass: ModuleToPostOrderCGSCCPassAdaptor<{{.*}}LazyCallGraph{{.*}}> +; CHECK-O-NEXT: Running analysis: InnerAnalysisManagerProxy +; CHECK-O-NEXT: Running analysis: LazyCallGraphAnalysis +; CHECK-O-NEXT: Starting CGSCC pass manager run. +; CHECK-O-NEXT: Running pass: InlinerPass +; CHECK-O-NEXT: Running analysis: OuterAnalysisManagerProxy<{{.*}}LazyCallGraph{{.*}}> +; CHECK-O-NEXT: Running pass: PostOrderFunctionAttrsPass +; CHECK-O-NEXT: Running analysis: FunctionAnalysisManagerCGSCCProxy +; CHECK-O3-NEXT: Running pass: ArgumentPromotionPass +; CHECK-O-NEXT: Running pass: CGSCCToFunctionPassAdaptor<{{.*}}PassManager{{.*}}> +; CHECK-O-NEXT: Starting llvm::Function pass manager run. +; CHECK-O-NEXT: Running pass: SROA +; CHECK-O-NEXT: Running pass: EarlyCSEPass +; CHECK-O-NEXT: Running pass: SpeculativeExecutionPass +; CHECK-O-NEXT: Running pass: JumpThreadingPass +; CHECK-O-NEXT: Running analysis: LazyValueAnalysis +; CHECK-O-NEXT: Running pass: CorrelatedValuePropagationPass +; CHECK-O-NEXT: Running pass: SimplifyCFGPass +; CHECK-O-NEXT: Running pass: InstCombinePass +; CHECK-O1-NEXT: Running pass: LibCallsShrinkWrapPass +; CHECK-O2-NEXT: Running pass: LibCallsShrinkWrapPass +; CHECK-O3-NEXT: Running pass: LibCallsShrinkWrapPass +; CHECK-O-NEXT: Running pass: TailCallElimPass +; CHECK-O-NEXT: Running pass: SimplifyCFGPass +; CHECK-O-NEXT: Running pass: ReassociatePass +; CHECK-O-NEXT: Running pass: RequireAnalysisPass<{{.*}}OptimizationRemarkEmitterAnalysis +; CHECK-O-NEXT: Running analysis: OptimizationRemarkEmitterAnalysis +; CHECK-O-NEXT: Running pass: FunctionToLoopPassAdaptor<{{.*}}LoopStandardAnalysisResults{{.*}}> +; CHECK-O-NEXT: Running analysis: LoopAnalysis +; CHECK-O-NEXT: Running analysis: ScalarEvolutionAnalysis +; CHECK-O-NEXT: Running analysis: InnerAnalysisManagerProxy +; CHECK-O-NEXT: Starting Loop pass manager run. +; CHECK-O-NEXT: Running pass: LoopRotatePass +; CHECK-O-NEXT: Running pass: LICM +; CHECK-O-NEXT: Running analysis: OuterAnalysisManagerProxy +; CHECK-O-NEXT: Finished Loop pass manager run. +; CHECK-O-NEXT: Running pass: SimplifyCFGPass +; CHECK-O-NEXT: Running pass: InstCombinePass +; CHECK-O-NEXT: Running pass: FunctionToLoopPassAdaptor<{{.*}}LoopStandardAnalysisResults{{.*}}> +; CHECK-O-NEXT: Starting Loop pass manager run. +; CHECK-O-NEXT: Running pass: IndVarSimplifyPass +; CHECK-O-NEXT: Running pass: LoopIdiomRecognizePass +; CHECK-O-NEXT: Running pass: LoopDeletionPass +; CHECK-O-NEXT: Running pass: LoopUnrollPass +; CHECK-O-NEXT: Finished Loop pass manager run. +; CHECK-Os-NEXT: Running pass: MergedLoadStoreMotionPass +; CHECK-Os-NEXT: Running pass: GVN +; CHECK-Oz-NEXT: Running pass: MergedLoadStoreMotionPass +; CHECK-Oz-NEXT: Running pass: GVN +; CHECK-O2-NEXT: Running pass: MergedLoadStoreMotionPass +; CHECK-O2-NEXT: Running pass: GVN +; CHECK-O3-NEXT: Running pass: MergedLoadStoreMotionPass +; CHECK-O3-NEXT: Running pass: GVN +; CHECK-O-NEXT: Running pass: MemCpyOptPass +; CHECK-O-NEXT: Running pass: SCCPPass +; CHECK-O-NEXT: Running pass: BDCEPass +; CHECK-O-NEXT: Running analysis: DemandedBitsAnalysis +; CHECK-O-NEXT: Running pass: InstCombinePass +; CHECK-O-NEXT: Running pass: JumpThreadingPass +; CHECK-O-NEXT: Running pass: CorrelatedValuePropagationPass +; CHECK-O-NEXT: Running pass: DSEPass +; CHECK-O-NEXT: Running pass: FunctionToLoopPassAdaptor<{{.*}}LICMPass{{.*}}> +; CHECK-O-NEXT: Running pass: ADCEPass +; CHECK-O-NEXT: Running analysis: PostDominatorTreeAnalysis +; CHECK-O-NEXT: Running pass: SimplifyCFGPass +; CHECK-O-NEXT: Running pass: InstCombinePass +; CHECK-O-NEXT: Finished llvm::Function pass manager run. +; CHECK-O-NEXT: Finished CGSCC pass manager run. +; CHECK-O-NEXT: Running pass: EliminateAvailableExternallyPass +; CHECK-O-NEXT: Running pass: ReversePostOrderFunctionAttrsPass +; CHECK-O-NEXT: Running pass: RequireAnalysisPass<{{.*}}GlobalsAA +; CHECK-O-NEXT: Running pass: ModuleToFunctionPassAdaptor<{{.*}}PassManager{{.*}}> +; CHECK-O-NEXT: Starting llvm::Function pass manager run. +; CHECK-O-NEXT: Running pass: Float2IntPass +; CHECK-O-NEXT: Running pass: FunctionToLoopPassAdaptor<{{.*}}LoopRotatePass +; CHECK-O-NEXT: Running pass: LoopDistributePass +; CHECK-O-NEXT: Running pass: LoopVectorizePass +; CHECK-O-NEXT: Running analysis: BlockFrequencyAnalysis +; CHECK-O-NEXT: Running analysis: BranchProbabilityAnalysis +; CHECK-O-NEXT: Running pass: LoopLoadEliminationPass +; CHECK-O-NEXT: Running analysis: LoopAccessAnalysis +; CHECK-O-NEXT: Running pass: InstCombinePass +; CHECK-O-NEXT: Running pass: SLPVectorizerPass +; CHECK-O-NEXT: Running pass: SimplifyCFGPass +; CHECK-O-NEXT: Running pass: InstCombinePass +; CHECK-O-NEXT: Running pass: FunctionToLoopPassAdaptor<{{.*}}LoopUnrollPass +; CHECK-O-NEXT: Running pass: InstCombinePass +; CHECK-O-NEXT: Running pass: RequireAnalysisPass<{{.*}}OptimizationRemarkEmitterAnalysis +; CHECK-O-NEXT: Running pass: FunctionToLoopPassAdaptor<{{.*}}LICMPass +; CHECK-O-NEXT: Running pass: AlignmentFromAssumptionsPass +; CHECK-O-NEXT: Running pass: LoopSinkPass +; CHECK-O-NEXT: Running pass: InstSimplifierPass +; CHECK-O-NEXT: Finished llvm::Function pass manager run. +; CHECK-O-NEXT: Running pass: GlobalDCEPass +; CHECK-O-NEXT: Running pass: ConstantMergePass +; CHECK-O-NEXT: Finished llvm::Module pass manager run. +; CHECK-O-NEXT: Running pass: PrintModulePass +; +; Make sure we get the IR back out without changes when we print the module. +; CHECK-O-LABEL: define void @foo(i32 %n) local_unnamed_addr { +; CHECK-O-NEXT: entry: +; CHECK-O-NEXT: br label %loop +; CHECK-O: loop: +; CHECK-O-NEXT: %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] +; CHECK-O-NEXT: %iv.next = add i32 %iv, 1 +; CHECK-O-NEXT: tail call void @bar() +; CHECK-O-NEXT: %cmp = icmp eq i32 %iv, %n +; CHECK-O-NEXT: br i1 %cmp, label %exit, label %loop +; CHECK-O: exit: +; CHECK-O-NEXT: ret void +; CHECK-O-NEXT: } +; +; CHECK-O-NEXT: Finished llvm::Module pass manager run. + +declare void @bar() local_unnamed_addr + +define void @foo(i32 %n) local_unnamed_addr { +entry: + br label %loop +loop: + %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] + %iv.next = add i32 %iv, 1 + tail call void @bar() + %cmp = icmp eq i32 %iv, %n + br i1 %cmp, label %exit, label %loop +exit: + ret void +} diff --git a/test/Other/new-pm-lto-defaults.ll b/test/Other/new-pm-lto-defaults.ll new file mode 100644 index 0000000000000..dfd2983532729 --- /dev/null +++ b/test/Other/new-pm-lto-defaults.ll @@ -0,0 +1,101 @@ +; Basic test for the new LTO pipeline. +; For now the only difference is between -O1 and everything else, so +; -O2, -O3, -Os, -Oz are the same. + +; RUN: opt -disable-verify -debug-pass-manager \ +; RUN: -passes='lto<O1>' -S %s 2>&1 \ +; RUN: | FileCheck %s --check-prefix=CHECK-O +; RUN: opt -disable-verify -debug-pass-manager \ +; RUN: -passes='lto<O2>' -S %s 2>&1 \ +; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O2 +; RUN: opt -disable-verify -debug-pass-manager \ +; RUN: -passes='lto<O3>' -S %s 2>&1 \ +; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O2 +; RUN: opt -disable-verify -debug-pass-manager \ +; RUN: -passes='lto<Os>' -S %s 2>&1 \ +; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O2 +; RUN: opt -disable-verify -debug-pass-manager \ +; RUN: -passes='lto<Oz>' -S %s 2>&1 \ +; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O2 + +; CHECK-O: Starting llvm::Module pass manager run. +; CHECK-O-NEXT: Running pass: PassManager<{{.*}}Module +; CHECK-O-NEXT: Starting llvm::Module pass manager run. +; CHECK-O-NEXT: Running pass: GlobalDCEPass +; CHECK-O-NEXT: Running pass: ForceFunctionAttrsPass +; CHECK-O-NEXT: Running pass: InferFunctionAttrsPass +; CHECK-O-NEXT: Running analysis: TargetLibraryAnalysis +; CHECK-O2-NEXT: PGOIndirectCallPromotion +; CHECK-O2-NEXT: Running pass: IPSCCPPass +; CHECK-O-NEXT: Running pass: ModuleToPostOrderCGSCCPassAdaptor<{{.*}}PostOrderFunctionAttrsPass> +; CHECK-O-NEXT: Running analysis: InnerAnalysisManagerProxy +; CHECK-O-NEXT: Running analysis: InnerAnalysisManagerProxy +; CHECK-O-NEXT: Running analysis: LazyCallGraphAnalysis +; CHECK-O-NEXT: Running analysis: FunctionAnalysisManagerCGSCCProxy +; CHECK-O-NEXT: Running analysis: OuterAnalysisManagerProxy<{{.*}}LazyCallGraph{{.*}}> +; CHECK-O-NEXT: Running analysis: AAManager +; CHECK-O-NEXT: Running analysis: TargetLibraryAnalysis +; CHECK-O-NEXT: Running pass: ReversePostOrderFunctionAttrsPass +; CHECK-O-NEXT: Running analysis: CallGraphAnalysis +; CHECK-O-NEXT: Running pass: GlobalSplitPass +; CHECK-O-NEXT: Running pass: WholeProgramDevirtPass +; CHECK-O2-NEXT: Running pass: GlobalOptPass +; CHECK-O2-NEXT: Running pass: ModuleToFunctionPassAdaptor<{{.*}}PromotePass> +; CHECK-O2-NEXT: Running analysis: DominatorTreeAnalysis +; CHECK-O2-NEXT: Running analysis: AssumptionAnalysis +; CHECK-O2-NEXT: Running pass: ConstantMergePass +; CHECK-O2-NEXT: Running pass: DeadArgumentEliminationPass +; CHECK-O2-NEXT: Running pass: ModuleToFunctionPassAdaptor<{{.*}}InstCombinePass> +; CHECK-O2-NEXT: Running pass: ModuleToPostOrderCGSCCPassAdaptor<{{.*}}InlinerPass> +; CHECK-O2-NEXT: Running pass: GlobalOptPass +; CHECK-O2-NEXT: Running pass: GlobalDCEPass +; CHECK-O2-NEXT: Running pass: ModuleToFunctionPassAdaptor<{{.*}}PassManager{{.*}}> +; CHECK-O2-NEXT: Starting llvm::Function pass manager run. +; CHECK-O2-NEXT: Running pass: InstCombinePass +; CHECK-O2-NEXT: Running pass: JumpThreadingPass +; CHECK-O2-NEXT: Running analysis: LazyValueAnalysis +; CHECK-O2-NEXT: Running pass: SROA on foo +; CHECK-O2-NEXT: Finished llvm::Function pass manager run. +; CHECK-O2-NEXT: Running pass: ModuleToPostOrderCGSCCPassAdaptor<{{.*}}PostOrderFunctionAttrsPass> +; CHECK-O2-NEXT: Running pass: ModuleToFunctionPassAdaptor<{{.*}}PassManager{{.*}}> +; CHECK-O2-NEXT: Running analysis: MemoryDependenceAnalysis +; CHECK-O2-NEXT: Running analysis: OptimizationRemarkEmitterAnalysis +; CHECK-O2-NEXT: Running analysis: TargetIRAnalysis +; CHECK-O2-NEXT: Running analysis: DemandedBitsAnalysis +; CHECK-O2-NEXT: Running pass: CrossDSOCFIPass +; CHECK-O2-NEXT: Running pass: ModuleToFunctionPassAdaptor<{{.*}}SimplifyCFGPass> +; CHECK-O2-NEXT: Running pass: EliminateAvailableExternallyPass +; CHECK-O2-NEXT: Running pass: GlobalDCEPass +; CHECK-O-NEXT: Finished llvm::Module pass manager run. +; CHECK-O-NEXT: Running pass: PrintModulePass + +; Make sure we get the IR back out without changes when we print the module. +; CHECK-O-LABEL: define void @foo(i32 %n) local_unnamed_addr { +; CHECK-O-NEXT: entry: +; CHECK-O-NEXT: br label %loop +; CHECK-O: loop: +; CHECK-O-NEXT: %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] +; CHECK-O-NEXT: %iv.next = add i32 %iv, 1 +; CHECK-O-NEXT: tail call void @bar() +; CHECK-O-NEXT: %cmp = icmp eq i32 %iv, %n +; CHECK-O-NEXT: br i1 %cmp, label %exit, label %loop +; CHECK-O: exit: +; CHECK-O-NEXT: ret void +; CHECK-O-NEXT: } +; +; CHECK-O-NEXT: Finished llvm::Module pass manager run. + +declare void @bar() local_unnamed_addr + +define void @foo(i32 %n) local_unnamed_addr { +entry: + br label %loop +loop: + %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] + %iv.next = add i32 %iv, 1 + tail call void @bar() + %cmp = icmp eq i32 %iv, %n + br i1 %cmp, label %exit, label %loop +exit: + ret void +} diff --git a/test/Other/optimization-remarks-invalidation.ll b/test/Other/optimization-remarks-invalidation.ll new file mode 100644 index 0000000000000..4a9fbac15c8a9 --- /dev/null +++ b/test/Other/optimization-remarks-invalidation.ll @@ -0,0 +1,80 @@ +; The purpose of this test is to check that the remark emission analysis result +; stays valid when it can and is invalidated otherwise. The code is just +; a minimal amount of code to exercise the pass. +; +; First make sure we emit remarks on this test case. +; RUN: opt %s -disable-output -aa-pipeline=basic-aa 2>&1 \ +; RUN: -passes='require<opt-remark-emit>,loop(licm)' \ +; RUN: -pass-remarks=licm -pass-remarks-with-hotness \ +; RUN: | FileCheck %s +; +; Check that passes which preserve BFI don't invalidate the emitter. +; RUN: opt %s -disable-output -aa-pipeline=basic-aa 2>&1 \ +; RUN: -passes='require<opt-remark-emit>,instcombine,require<opt-remark-emit>,loop(licm)' -debug-pass-manager \ +; RUN: -pass-remarks=licm -pass-remarks-with-hotness \ +; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-PM-PRESERVE +; +; Check that invalidating BFI computes a fresh emitter. +; RUN: opt %s -disable-output -aa-pipeline=basic-aa 2>&1 \ +; RUN: -passes='require<opt-remark-emit>,invalidate<block-freq>,require<opt-remark-emit>,loop(licm)' -debug-pass-manager \ +; RUN: -pass-remarks=licm -pass-remarks-with-hotness \ +; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-PM-INVALIDATE +; +; Check that invalidating BFI desn't compute a fresh emitter when we don't +; request hotness remarks. +; RUN: opt %s -disable-output -aa-pipeline=basic-aa 2>&1 \ +; RUN: -passes='require<opt-remark-emit>,invalidate<block-freq>,require<opt-remark-emit>,loop(licm)' -debug-pass-manager \ +; RUN: -pass-remarks=licm \ +; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-PM-NO-INVALIDATE + +target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128" + +define void @hoist(i32* %array, i32* noalias %p) { +; CHECK-PM-PRESERVE: Running analysis: OptimizationRemarkEmitterAnalysis +; CHECK-PM-PRESERVE: Running pass: InstCombinePass +; CHECK-PM-PRESERVE-NOT: Invalidating analysis: OptimizationRemarkEmitterAnalysis +; CHECK-PM-PRESERVE-NOT: Running analysis: OptimizationRemarkEmitterAnalysis +; CHECK-PM-PRESERVE: Running pass: LICMPass +; CHECK-PM-INVALIDATE: Running analysis: OptimizationRemarkEmitterAnalysis +; CHECK-PM-INVALIDATE: Running pass: InvalidateAnalysisPass +; CHECK-PM-INVALIDATE: Invalidating analysis: OptimizationRemarkEmitterAnalysis +; CHECK-PM-INVALIDATE: Running analysis: OptimizationRemarkEmitterAnalysis +; CHECK-PM-INVALIDATE: Running pass: LICMPass +; CHECK-PM-NO-INVALIDATE: Running analysis: OptimizationRemarkEmitterAnalysis +; CHECK-PM-NO-INVALIDATE: Running pass: InvalidateAnalysisPass +; CHECK-PM-NO-INVALIDATE-NOT: Invalidating analysis: OptimizationRemarkEmitterAnalysis +; CHECK-PM-NO-INVALIDATE-NOT: Running analysis: OptimizationRemarkEmitterAnalysis +; CHECK-PM-NO-INVALIDATE: Running pass: LICMPass + +Entry: + br label %Loop + +Loop: + %j = phi i32 [ 0, %Entry ], [ %Next, %Loop ] + %addr = getelementptr i32, i32* %array, i32 %j + %a = load i32, i32* %addr +; CHECK: remark: /tmp/kk.c:2:20: hoisting load + %b = load i32, i32* %p, !dbg !8 + %a2 = add i32 %a, %b + store i32 %a2, i32* %addr + %Next = add i32 %j, 1 + %cond = icmp eq i32 %Next, 0 + br i1 %cond, label %Out, label %Loop + +Out: + ret void +} + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!3, !4} +!llvm.ident = !{!5} + +!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 3.9.0 ", isOptimized: true, runtimeVersion: 0, emissionKind: NoDebug, enums: !2) +!1 = !DIFile(filename: "/tmp/kk.c", directory: "/tmp") +!2 = !{} +!3 = !{i32 2, !"Debug Info Version", i32 3} +!4 = !{i32 1, !"PIC Level", i32 2} +!5 = !{!"clang version 3.9.0 "} +!6 = distinct !DISubprogram(name: "success", scope: !1, file: !1, line: 1, type: !7, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, variables: !2) +!7 = !DISubroutineType(types: !2) +!8 = !DILocation(line: 2, column: 20, scope: !6) diff --git a/test/Other/optimization-remarks-lazy-bfi.ll b/test/Other/optimization-remarks-lazy-bfi.ll new file mode 100644 index 0000000000000..bb6459acc062c --- /dev/null +++ b/test/Other/optimization-remarks-lazy-bfi.ll @@ -0,0 +1,88 @@ +; Check that BFI is not computed when -pass-remarks-with-hotness is off + +; RUN: opt -loop-distribute -enable-loop-distribute -S -pass-remarks-missed=loop-distribute \ +; RUN: -debug-only=block-freq,branch-prob -pass-remarks-with-hotness \ +; RUN: < %s 2>&1 | FileCheck %s --check-prefix=HOTNESS +; RUN: opt -loop-distribute -enable-loop-distribute -S -pass-remarks-missed=loop-distribute \ +; RUN: -debug-only=block-freq,branch-prob \ +; RUN: < %s 2>&1 | FileCheck %s --check-prefix=NO_HOTNESS + +; RUN: opt -passes='require<aa>,loop-distribute' -S -pass-remarks-missed=loop-distribute \ +; RUN: -debug-only=block-freq,branch-prob -pass-remarks-with-hotness \ +; RUN: < %s 2>&1 | FileCheck %s --check-prefix=HOTNESS +; RUN: opt -passes='require<aa>,loop-distribute' -S -pass-remarks-missed=loop-distribute \ +; RUN: -debug-only=block-freq,branch-prob \ +; RUN: < %s 2>&1 | FileCheck %s --check-prefix=NO_HOTNESS + +; REQUIRES: asserts + +; HOTNESS: Branch Probability Info : forced +; HOTNESS: block-frequency: forced +; NO_HOTNESS-NOT: Branch Probability Info : forced +; NO_HOTNESS-NOT: block-frequency: forced + +; This is the input program: +; +; 1 void forced (char *A, char *B, char *C, int N) { +; 2 #pragma clang loop distribute(enable) +; 3 for(int i = 0; i < N; i++) { +; 4 A[i] = B[i] * C[i]; +; 5 } +; 6 } + +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.11.0" + + +define void @forced(i8* %A, i8* %B, i8* %C, i32 %N) !dbg !7 !prof !22 { +entry: + %cmp12 = icmp sgt i32 %N, 0, !dbg !9 + br i1 %cmp12, label %ph, label %for.cond.cleanup, !dbg !10, !prof !23 + +ph: + br label %for.body + +for.body: + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %ph ] + %arrayidx = getelementptr inbounds i8, i8* %B, i64 %indvars.iv, !dbg !12 + %0 = load i8, i8* %arrayidx, align 1, !dbg !12, !tbaa !13 + %arrayidx2 = getelementptr inbounds i8, i8* %C, i64 %indvars.iv, !dbg !16 + %1 = load i8, i8* %arrayidx2, align 1, !dbg !16, !tbaa !13 + %mul = mul i8 %1, %0, !dbg !17 + %arrayidx6 = getelementptr inbounds i8, i8* %A, i64 %indvars.iv, !dbg !18 + store i8 %mul, i8* %arrayidx6, align 1, !dbg !19, !tbaa !13 + %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1, !dbg !10 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32, !dbg !10 + %exitcond = icmp eq i32 %lftr.wideiv, %N, !dbg !10 + br i1 %exitcond, label %for.cond.cleanup, label %for.body, !dbg !10, !llvm.loop !20, !prof !24 + +for.cond.cleanup: + ret void, !dbg !11 +} + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!3, !4} + +!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 3.9.0 (trunk 267633) (llvm/trunk 267675)", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !2) +!1 = !DIFile(filename: "/tmp/t.c", directory: "/tmp") +!2 = !{} +!3 = !{i32 2, !"Dwarf Version", i32 2} +!4 = !{i32 2, !"Debug Info Version", i32 3} +!7 = distinct !DISubprogram(name: "forced", scope: !1, file: !1, line: 1, type: !8, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, variables: !2) +!8 = !DISubroutineType(types: !2) +!9 = !DILocation(line: 3, column: 20, scope: !7) +!10 = !DILocation(line: 3, column: 3, scope: !7) +!11 = !DILocation(line: 6, column: 1, scope: !7) +!12 = !DILocation(line: 4, column: 12, scope: !7) +!13 = !{!14, !14, i64 0} +!14 = !{!"omnipotent char", !15, i64 0} +!15 = !{!"Simple C/C++ TBAA"} +!16 = !DILocation(line: 4, column: 19, scope: !7) +!17 = !DILocation(line: 4, column: 17, scope: !7) +!18 = !DILocation(line: 4, column: 5, scope: !7) +!19 = !DILocation(line: 4, column: 10, scope: !7) +!20 = distinct !{!20, !21} +!21 = !{!"llvm.loop.distribute.enable", i1 true} +!22 = !{!"function_entry_count", i64 3} +!23 = !{!"branch_weights", i32 99, i32 1} +!24 = !{!"branch_weights", i32 1, i32 99} diff --git a/test/Other/writing-to-stdout.ll b/test/Other/writing-to-stdout.ll new file mode 100644 index 0000000000000..e3dee782ce699 --- /dev/null +++ b/test/Other/writing-to-stdout.ll @@ -0,0 +1,16 @@ +; REQUIRES: default_triple + +; Often LLVM tools use "-" to indicate that output should be written to stdout +; instead of a file. This behaviour is implemented by the raw_fd_ostream class. +; This test verifies that when doing so multiple times we don't try to access a +; closed STDOUT_FILENO. The exact options used in this test are unimportant, as +; long as they write to stdout using raw_fd_ostream. +; RUN: llc %s -o=- -pass-remarks-output=- -filetype=asm | FileCheck %s +; foobar should appear as a function somewhere in the assembly file. +; CHECK: foobar +; !Analysis appears at the start of pass-remarks-output. +; CHECK: !Analysis + +define void @foobar() { + ret void +} |