1; RUN: opt     -S -debug -enable-new-pm=0 %s 2>&1 | FileCheck %s --check-prefix=O0
2; RUN: opt -O1 -S -debug -enable-new-pm=0 %s 2>&1 | FileCheck %s --check-prefix=O1
3; RUN: opt -O2 -S -debug -enable-new-pm=0 %s 2>&1 | FileCheck %s --check-prefix=O1 --check-prefix=O2O3
4; RUN: opt -O3 -S -debug -enable-new-pm=0 %s 2>&1 | FileCheck %s --check-prefix=O1 --check-prefix=O2O3
5; RUN: opt -dce -gvn-hoist -loweratomic -S -debug -enable-new-pm=0 %s 2>&1 | FileCheck %s --check-prefix=MORE
6; RUN: opt -passes='default<O0>' -S -debug-pass-manager %s 2>&1 | FileCheck %s --check-prefix=%llvmcheckext-NPM-O0
7; RUN: opt -passes='default<O1>' -S -debug-pass-manager %s 2>&1 | FileCheck %s --check-prefix=NPM-O1
8; RUN: opt -passes='default<O2>' -S -debug-pass-manager %s 2>&1 | FileCheck %s --check-prefix=NPM-O1 --check-prefix=NPM-O2O3
9; RUN: opt -passes='default<O3>' -S -debug-pass-manager %s 2>&1 | FileCheck %s --check-prefix=NPM-O1 --check-prefix=NPM-O2O3
10; RUN: opt -passes='dce,gvn-hoist,loweratomic' -S -debug-pass-manager %s 2>&1 | FileCheck %s --check-prefix=NPM-MORE
11; RUN: opt -passes='loop(indvars,licm,loop-deletion,loop-idiom,loop-instsimplify,loop-reduce,simple-loop-unswitch),loop-unroll' -S -debug-pass-manager %s 2>&1 | FileCheck %s --check-prefix=NPM-LOOP
12; RUN: opt -passes='instsimplify,verify' -S -debug-pass-manager %s 2>&1 | FileCheck %s --check-prefix=NPM-REQUIRED
13
14; REQUIRES: asserts
15
16; This test verifies that we don't run target independent IR-level
17; optimizations on optnone functions.
18
19; Function Attrs: noinline optnone
20define i32 @foo(i32 %x) #0 {
21entry:
22  %x.addr = alloca i32, align 4
23  store i32 %x, i32* %x.addr, align 4
24  br label %while.cond
25
26while.cond:                                       ; preds = %while.body, %entry
27  %0 = load i32, i32* %x.addr, align 4
28  %dec = add nsw i32 %0, -1
29  store i32 %dec, i32* %x.addr, align 4
30  %tobool = icmp ne i32 %0, 0
31  br i1 %tobool, label %while.body, label %while.end
32
33while.body:                                       ; preds = %while.cond
34  br label %while.cond
35
36while.end:                                        ; preds = %while.cond
37  ret i32 %dec
38}
39
40attributes #0 = { optnone noinline }
41
42; Nothing that runs at -O0 gets skipped (except when the Bye extension is present).
43; O0-NOT: Skipping pass
44; CHECK-EXT-NPM-O0: Skipping pass {{.*}}Bye
45; CHECK-NOEXT-NPM-O0-NOT: Skipping pass
46
47; IR passes run at -O1 and higher.
48; O1-DAG: Skipping pass 'Aggressive Dead Code Elimination'
49; O1-DAG: Skipping pass 'Combine redundant instructions'
50; O1-DAG: Skipping pass 'Early CSE'
51; O1-DAG: Skipping pass 'Reassociate expressions'
52; O1-DAG: Skipping pass 'Simplify the CFG'
53; O1-DAG: Skipping pass 'Sparse Conditional Constant Propagation'
54; NPM-O1-DAG: Skipping pass: SimplifyCFGPass on foo
55; NPM-O1-DAG: Skipping pass: SROA
56; NPM-O1-DAG: Skipping pass: EarlyCSEPass
57; NPM-O1-DAG: Skipping pass: LowerExpectIntrinsicPass
58; NPM-O1-DAG: Skipping pass: PromotePass
59; NPM-O1-DAG: Skipping pass: InstCombinePass
60
61; Additional IR passes run at -O2 and higher.
62; O2O3-DAG: Skipping pass 'Global Value Numbering'
63; O2O3-DAG: Skipping pass 'SLP Vectorizer'
64; NPM-O2O3-DAG: Skipping pass: GVN
65; NPM-O2O3-DAG: Skipping pass: SLPVectorizerPass
66
67; Additional IR passes that opt doesn't turn on by default.
68; MORE-DAG: Skipping pass 'Dead Code Elimination'
69; NPM-MORE-DAG: Skipping pass: DCEPass
70; NPM-MORE-DAG: Skipping pass: GVNHoistPass
71
72; Loop IR passes that opt doesn't turn on by default.
73; LOOP-DAG: Skipping pass 'Delete dead loops'
74; LOOP-DAG: Skipping pass 'Induction Variable Simplification'
75; LOOP-DAG: Skipping pass 'Loop Invariant Code Motion'
76; LOOP-DAG: Skipping pass 'Loop Strength Reduction'
77; LOOP-DAG: Skipping pass 'Recognize loop idioms'
78; LOOP-DAG: Skipping pass 'Reroll loops'
79; LOOP-DAG: Skipping pass 'Rotate Loops'
80; LOOP-DAG: Skipping pass 'Simplify instructions in loops'
81; LOOP-DAG: Skipping pass 'Unroll loops'
82; LOOP-DAG: Skipping pass 'Unswitch loops'
83; LoopPassManager should not be skipped over an optnone function
84; NPM-LOOP-NOT: Skipping pass: PassManager
85; NPM-LOOP-DAG: Skipping pass: LoopSimplifyPass on foo
86; NPM-LOOP-DAG: Skipping pass: LCSSAPass
87; NPM-LOOP-DAG: Skipping pass: IndVarSimplifyPass
88; NPM-LOOP-DAG: Skipping pass: SimpleLoopUnswitchPass
89; NPM-LOOP-DAG: Skipping pass: LoopUnrollPass
90; NPM-LOOP-DAG: Skipping pass: LoopStrengthReducePass
91; NPM-LOOP-DAG: Skipping pass: LoopDeletionPass
92; NPM-LOOP-DAG: Skipping pass: LICMPass
93; NPM-LOOP-DAG: Skipping pass: LoopIdiomRecognizePass
94; NPM-LOOP-DAG: Skipping pass: LoopInstSimplifyPass
95
96; NPM-REQUIRED-DAG: Skipping pass: InstSimplifyPass
97; NPM-REQUIRED-DAG: Skipping pass InstSimplifyPass on foo due to optnone attribute
98; NPM-REQUIRED-DAG: Running pass: VerifierPass
99; NPM-REQUIRED-NOT: Skipping pass: VerifyPass
100; NPM-REQUIRED-NOT: Skipping pass VerifyPass on foo due to optnone attribute
101