blob: 29eaa03243e0d8ee9667dac6834598ce53e29fcc [file] [log] [blame]
Diego Novillod23ec942014-05-29 19:55:06 +00001// This file tests the -Rpass family of flags (-Rpass, -Rpass-missed
2// and -Rpass-analysis) with the inliner. The test is designed to
3// always trigger the inliner, so it should be independent of the
4// optimization level.
Diego Novillo829b1702014-04-16 16:54:24 +00005
Diego Novillo913690c2014-06-24 17:02:17 +00006// RUN: %clang_cc1 %s -Rpass=inline -Rpass-analysis=inline -Rpass-missed=inline -O0 -emit-llvm-only -verify
Douglas Katzman3459ce22015-10-08 04:24:12 +00007// RUN: %clang_cc1 %s -Rpass=inline -Rpass-analysis=inline -Rpass-missed=inline -O0 -emit-llvm-only -debug-info-kind=line-tables-only -verify
David Blaikiebcc60042014-06-24 17:31:05 +00008// RUN: %clang_cc1 %s -Rpass=inline -emit-llvm -o - 2>/dev/null | FileCheck %s
Richard Smith3be1cb22014-08-07 00:24:21 +00009//
10// Check that we can override -Rpass= with -Rno-pass.
11// RUN: %clang_cc1 %s -Rpass=inline -emit-llvm -o - 2>&1 | FileCheck %s --check-prefix=CHECK-REMARKS
12// RUN: %clang_cc1 %s -Rpass=inline -Rno-pass -emit-llvm -o - 2>&1 | FileCheck %s --check-prefix=CHECK-NO-REMARKS
13// RUN: %clang_cc1 %s -Rpass=inline -Rno-everything -emit-llvm -o - 2>&1 | FileCheck %s --check-prefix=CHECK-NO-REMARKS
14// RUN: %clang_cc1 %s -Rpass=inline -Rno-everything -Reverything -emit-llvm -o - 2>&1 | FileCheck %s --check-prefix=CHECK-REMARKS
15//
16// FIXME: -Reverything should imply -Rpass=.*.
17// RUN: %clang_cc1 %s -Reverything -emit-llvm -o - 2>/dev/null | FileCheck %s --check-prefix=CHECK-NO-REMARKS
18//
19// FIXME: -Rpass should either imply -Rpass=.* or should be rejected.
20// RUN: %clang_cc1 %s -Rpass -emit-llvm -o - 2>/dev/null | FileCheck %s --check-prefix=CHECK-NO-REMARKS
21
22// CHECK-REMARKS: remark:
23// CHECK-NO-REMARKS-NOT: remark:
Diego Novillo913690c2014-06-24 17:02:17 +000024
25// -Rpass should produce source location annotations, exclusively (just
26// like -gmlt).
27// CHECK: , !dbg !
28// CHECK-NOT: DW_TAG_base_type
29
Adrian Prantl826824e2016-04-08 22:43:06 +000030// The CU should be marked NoDebug (to prevent writing debug info to
Diego Novillo913690c2014-06-24 17:02:17 +000031// the final output).
Adrian Prantl826824e2016-04-08 22:43:06 +000032// CHECK: !llvm.dbg.cu = !{![[CU:.*]]}
33// CHECK: ![[CU]] = distinct !DICompileUnit({{.*}}emissionKind: NoDebug
Diego Novillo829b1702014-04-16 16:54:24 +000034
35int foo(int x, int y) __attribute__((always_inline));
Diego Novillo829b1702014-04-16 16:54:24 +000036int foo(int x, int y) { return x + y; }
Diego Novillo829b1702014-04-16 16:54:24 +000037
Diego Novillod23ec942014-05-29 19:55:06 +000038float foz(int x, int y) __attribute__((noinline));
39float foz(int x, int y) { return x * y; }
40
41// The negative diagnostics are emitted twice because the inliner runs
42// twice.
43//
Alp Toker27506272014-06-05 22:11:12 +000044int bar(int j) {
Adam Nemet820086a22017-01-30 16:22:50 +000045// expected-remark@+3 {{foz not inlined into bar because it should never be inlined (cost=never)}}
Sam Elliott23079052017-08-21 16:40:35 +000046// expected-remark@+2 {{foz not inlined into bar because it should never be inlined (cost=never)}}
Evgeniy Stepanov6b2a61d2015-09-14 21:35:16 +000047// expected-remark@+1 {{foo inlined into bar}}
Alp Toker27506272014-06-05 22:11:12 +000048 return foo(j, j - 2) * foz(j - 2, j);
49}