
Add support for /Ob1 (and equivalent -finline-hint-functions), which enable inlining only for functions marked inline, either explicitly (via inline keyword, for example), or implicitly (function definition in class body, for example). This works by enabling inlining pass, and adding noinline attribute to every function not marked inline. Patch by Rudy Pons <rudy.pons@ilod.org>! Differential Revision: http://reviews.llvm.org/D20647 llvm-svn: 273440
32 lines
1.3 KiB
C
32 lines
1.3 KiB
C
// Make sure -finline-functions family flags are behaving correctly.
|
|
|
|
// RUN: %clang_cc1 -triple i686-pc-win32 -emit-llvm %s -o - | FileCheck -check-prefix=NOINLINE %s
|
|
// RUN: %clang_cc1 -triple i686-pc-win32 -O3 -fno-inline-functions -emit-llvm %s -o - | FileCheck -check-prefix=NOINLINE %s
|
|
// RUN: %clang_cc1 -triple i686-pc-win32 -finline-hint-functions -emit-llvm %s -o - | FileCheck -check-prefix=HINT %s
|
|
// RUN: %clang_cc1 -triple i686-pc-win32 -finline-functions -emit-llvm %s -o - | FileCheck -check-prefix=INLINE %s
|
|
|
|
inline int inline_hint(int a, int b) { return(a+b); }
|
|
|
|
int inline_no_hint(int a, int b) { return (a/b); }
|
|
|
|
inline __attribute__ ((__always_inline__)) int inline_always(int a, int b) { return(a*b); }
|
|
|
|
volatile int *pa = (int*) 0x1000;
|
|
void foo() {
|
|
// NOINLINE-LABEL: @foo
|
|
// HINT-LABEL: @foo
|
|
// INLINE-LABEL: @foo
|
|
// NOINLINE: call i32 @inline_hint
|
|
// HINT-NOT: call i32 @inline_hint
|
|
// INLINE-NOT: call i32 @inline_hint
|
|
pa[0] = inline_hint(pa[1],pa[2]);
|
|
// NOINLINE-NOT: call i32 @inline_always
|
|
// HINT-NOT: call i32 @inline_always
|
|
// INLINE-NOT: call i32 @inline_always
|
|
pa[3] = inline_always(pa[4],pa[5]);
|
|
// NOINLINE: call i32 @inline_no_hint
|
|
// HINT: call i32 @inline_no_hint
|
|
// INLINE-NOT: call i32 @inline_no_hint
|
|
pa[6] = inline_no_hint(pa[7], pa[8]);
|
|
}
|