1;RUN: opt %s -aa-pipeline= -passes='adce,loop(loop-rotate),adce' -S -debug-pass-manager -debug-only=loop-rotate 2>&1 | FileCheck %s
2;RUN: opt %s -aa-pipeline= -passes='adce,loop-mssa(loop-rotate),adce' -S -debug-pass-manager -debug-only=loop-rotate -verify-memoryssa 2>&1 | FileCheck %s --check-prefix=MSSA
3;REQUIRES: asserts
4
5; This test is to make sure we invalidate the post dominator pass after loop rotate simplifies the loop latch.
6; The adce passes are here to make sure post dominator analysis is required.
7
8; CHECK: Starting llvm::Function pass manager run.
9; CHECK-NEXT: Running pass: ADCEPass on f
10; CHECK-NEXT: Running analysis: PostDominatorTreeAnalysis on f
11; CHECK-NEXT: Starting llvm::Function pass manager run.
12; CHECK-NEXT: Running pass: LoopSimplifyPass on f
13; CHECK-NEXT: Running analysis: LoopAnalysis on f
14; CHECK-NEXT: Running analysis: DominatorTreeAnalysis on f
15; CHECK-NEXT: Running analysis: AssumptionAnalysis on f
16; CHECK-NEXT: Running pass: LCSSAPass on f
17; CHECK-NEXT: Finished llvm::Function pass manager run.
18; CHECK-NEXT: Running analysis: AAManager on f
19; CHECK-NEXT: Running analysis: TargetLibraryAnalysis on f
20; CHECK-NEXT: Running analysis: ScalarEvolutionAnalysis on f
21; CHECK-NEXT: Running analysis: TargetIRAnalysis on f
22; CHECK-NEXT: Running analysis: InnerAnalysisManagerProxy{{.*}} on f
23; CHECK-NEXT: Starting Loop pass manager run.
24; CHECK-NEXT: Running pass: LoopRotatePass on Loop at depth 1 containing: %bb<header><exiting>,%bb4<latch>
25; CHECK-NEXT: Folding loop latch bb4 into bb
26; CHECK-NEXT: Finished Loop pass manager run.
27; CHECK-NEXT: Invalidating analysis: PostDominatorTreeAnalysis on f
28; CHECK-NEXT: Running pass: ADCEPass on f
29; CHECK-NEXT: Running analysis: PostDominatorTreeAnalysis on f
30; CHECK-NEXT: Finished llvm::Function pass manager run.
31
32; MSSA: Starting llvm::Function pass manager run.
33; MSSA-NEXT: Running pass: ADCEPass on f
34; MSSA-NEXT: Running analysis: PostDominatorTreeAnalysis on f
35; MSSA-NEXT: Starting llvm::Function pass manager run.
36; MSSA-NEXT: Running pass: LoopSimplifyPass on f
37; MSSA-NEXT: Running analysis: LoopAnalysis on f
38; MSSA-NEXT: Running analysis: DominatorTreeAnalysis on f
39; MSSA-NEXT: Running analysis: AssumptionAnalysis on f
40; MSSA-NEXT: Running pass: LCSSAPass on f
41; MSSA-NEXT: Finished llvm::Function pass manager run.
42; MSSA-NEXT: Running analysis: MemorySSAAnalysis on f
43; MSSA-NEXT: Running analysis: AAManager on f
44; MSSA-NEXT: Running analysis: TargetLibraryAnalysis on f
45; MSSA-NEXT: Running analysis: ScalarEvolutionAnalysis on f
46; MSSA-NEXT: Running analysis: TargetIRAnalysis on f
47; MSSA-NEXT: Running analysis: InnerAnalysisManagerProxy{{.*}} on f
48; MSSA-NEXT: Starting Loop pass manager run.
49; MSSA-NEXT: Running pass: LoopRotatePass on Loop at depth 1 containing: %bb<header><exiting>,%bb4<latch>
50; MSSA-NEXT: Folding loop latch bb4 into bb
51; MSSA-NEXT: Finished Loop pass manager run.
52; MSSA-NEXT: Invalidating analysis: PostDominatorTreeAnalysis on f
53; MSSA-NEXT: Running pass: ADCEPass on f
54; MSSA-NEXT: Running analysis: PostDominatorTreeAnalysis on f
55; MSSA-NEXT: Finished llvm::Function pass manager run.
56
57; CHECK-LABEL: define i8 @f() {
58; CHECK-NEXT:  entry:
59; CHECK-NEXT:    br label %bb
60; CHECK:       bb:                                               ; preds = %bb, %entry
61; CHECK-NEXT:    %mode.0 = phi i8 [ 0, %entry ], [ %indvar.next, %bb ]
62; CHECK-NEXT:    %tmp5 = icmp eq i8 %mode.0, 1
63; CHECK-NEXT:    %indvar.next = add i8 %mode.0, 1
64; CHECK-NEXT:    br i1 %tmp5, label %bb5, label %bb
65; CHECK:       bb5:                                              ; preds = %bb
66; CHECK-NEXT:    tail call void @raise_exception() #0
67; CHECK-NEXT:    unreachable
68; CHECK-NEXT:  }
69; CHECK:       ; Function Attrs: noreturn
70; CHECK:       declare void @raise_exception() #0
71; CHECK:       attributes #0 = { noreturn }
72
73; MSSA-LABEL: define i8 @f() {
74; MSSA-NEXT:  entry:
75; MSSA-NEXT:    br label %bb
76; MSSA:       bb:                                               ; preds = %bb, %entry
77; MSSA-NEXT:    %mode.0 = phi i8 [ 0, %entry ], [ %indvar.next, %bb ]
78; MSSA-NEXT:    %tmp5 = icmp eq i8 %mode.0, 1
79; MSSA-NEXT:    %indvar.next = add i8 %mode.0, 1
80; MSSA-NEXT:    br i1 %tmp5, label %bb5, label %bb
81; MSSA:       bb5:                                              ; preds = %bb
82; MSSA-NEXT:    tail call void @raise_exception() #0
83; MSSA-NEXT:    unreachable
84; MSSA-NEXT:  }
85; MSSA:       ; Function Attrs: noreturn
86; MSSA:       declare void @raise_exception() #0
87; MSSA:       attributes #0 = { noreturn }
88
89define i8 @f() {
90entry:
91  br label %bb
92
93bb:                                               ; preds = %bb4, %entry
94  %mode.0 = phi i8 [ 0, %entry ], [ %indvar.next, %bb4 ]
95  %tmp5 = icmp eq i8 %mode.0, 1
96  br i1 %tmp5, label %bb5, label %bb4
97
98bb4:                                              ; preds = %bb2
99  %indvar.next = add i8 %mode.0, 1
100  br label %bb
101
102bb5:                                              ; preds = %bb2
103  tail call void @raise_exception() #0
104  unreachable
105}
106
107; Function Attrs: noreturn
108declare void @raise_exception() #0
109
110attributes #0 = { noreturn }
111