1; The IR below was crafted so as: 2; 1) To have a loop, so we create a loop pass manager 3; 2) To be "immutable" in the sense that no pass in the standard 4; pipeline will modify it. 5; Since no transformations take place, we don't expect any analyses 6; to be invalidated. 7; Any invalidation that shows up here is a bug, unless we started modifying 8; the IR, in which case we need to make it immutable harder. 9 10; RUN: opt -disable-verify -verify-analysis-invalidation=0 -debug-pass-manager \ 11; RUN: -passes='default<O0>' -S %s 2>&1 \ 12; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-DEFAULT,CHECK-CORO 13; RUN: opt -disable-verify -verify-analysis-invalidation=0 -debug-pass-manager -enable-matrix \ 14; RUN: -passes='default<O0>' -S %s 2>&1 \ 15; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-DEFAULT,CHECK-MATRIX,CHECK-CORO 16; RUN: opt -disable-verify -verify-analysis-invalidation=0 -debug-pass-manager -debug-info-for-profiling \ 17; RUN: -passes='default<O0>' -S %s 2>&1 \ 18; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-DIS,CHECK-CORO 19; RUN: opt -disable-verify -verify-analysis-invalidation=0 -debug-pass-manager \ 20; RUN: -passes='thinlto-pre-link<O0>' -S %s 2>&1 \ 21; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-DEFAULT,CHECK-PRE-LINK,CHECK-CORO 22; RUN: opt -disable-verify -verify-analysis-invalidation=0 -debug-pass-manager \ 23; RUN: -passes='lto-pre-link<O0>' -S %s 2>&1 \ 24; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-DEFAULT,CHECK-PRE-LINK,CHECK-CORO 25; RUN: opt -disable-verify -verify-analysis-invalidation=0 -debug-pass-manager \ 26; RUN: -passes='thinlto<O0>' -S %s 2>&1 \ 27; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-THINLTO 28; RUN: opt -disable-verify -verify-analysis-invalidation=0 -debug-pass-manager \ 29; RUN: -passes='lto<O0>' -S %s 2>&1 \ 30; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-LTO 31 32; CHECK-DIS: Running analysis: InnerAnalysisManagerProxy 33; CHECK-DIS-NEXT: Running pass: EntryExitInstrumenterPass 34; CHECK-DIS-NEXT: Running pass: AddDiscriminatorsPass 35; CHECK-DIS-NEXT: Running pass: AlwaysInlinerPass 36; CHECK-DIS-NEXT: Running analysis: ProfileSummaryAnalysis 37; CHECK-DEFAULT: Running analysis: InnerAnalysisManagerProxy 38; CHECK-DEFAULT-NEXT: Running pass: EntryExitInstrumenterPass 39; CHECK-DEFAULT-NEXT: Running pass: AlwaysInlinerPass 40; CHECK-DEFAULT-NEXT: Running analysis: ProfileSummaryAnalysis 41; CHECK-MATRIX: Running pass: LowerMatrixIntrinsicsPass 42; CHECK-MATRIX-NEXT: Running analysis: TargetIRAnalysis 43; CHECK-CORO-NEXT: Running pass: CoroConditionalWrapper 44; CHECK-PRE-LINK: Running pass: CanonicalizeAliasesPass 45; CHECK-PRE-LINK-NEXT: Running pass: NameAnonGlobalPass 46; CHECK-THINLTO: Running pass: LowerTypeTestsPass 47; CHECK-THINLTO-NEXT: Running pass: EliminateAvailableExternallyPass 48; CHECK-THINLTO-NEXT: Running pass: GlobalDCEPass 49; CHECK-LTO: Running pass: CrossDSOCFIPass on [module] 50; CHECK-LTO-NEXT: Running pass: WholeProgramDevirtPass 51; CHECK-LTO-NEXT: Running analysis: InnerAnalysisManagerProxy 52; CHECK-LTO-NEXT: Running pass: LowerTypeTestsPass 53; CHECK-LTO-NEXT: Running pass: LowerTypeTestsPass 54; CHECK-CORO-NEXT: Running pass: AnnotationRemarksPass 55; CHECK-CORO-NEXT: Running analysis: TargetLibraryAnalysis 56; CHECK-LTO-NEXT: Running pass: AnnotationRemarksPass 57; CHECK-LTO-NEXT: Running analysis: TargetLibraryAnalysis 58; CHECK-NEXT: Running pass: PrintModulePass 59 60; Make sure we get the IR back out without changes when we print the module. 61; CHECK-LABEL: define void @foo(i32 %n) local_unnamed_addr { 62; CHECK-NEXT: entry: 63; CHECK-NEXT: br label %loop 64; CHECK: loop: 65; CHECK-NEXT: %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 66; CHECK-NEXT: %iv.next = add i32 %iv, 1 67; CHECK-NEXT: tail call void @bar() 68; CHECK-NEXT: %cmp = icmp eq i32 %iv, %n 69; CHECK-NEXT: br i1 %cmp, label %exit, label %loop 70; CHECK: exit: 71; CHECK-NEXT: ret void 72; CHECK-NEXT: } 73; 74 75declare void @bar() local_unnamed_addr 76 77define void @foo(i32 %n) local_unnamed_addr { 78entry: 79 br label %loop 80loop: 81 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 82 %iv.next = add i32 %iv, 1 83 tail call void @bar() 84 %cmp = icmp eq i32 %iv, %n 85 br i1 %cmp, label %exit, label %loop 86exit: 87 ret void 88} 89